--- /dev/null
+From 6f3603367b8f7c34598fdfc1058622e0e1951e98 Mon Sep 17 00:00:00 2001
+From: Roland Dreier <roland@purestorage.com>
+Date: Thu, 12 Apr 2012 07:51:08 -0700
+Subject: IB/srpt: Set srq_type to IB_SRQT_BASIC
+
+From: Roland Dreier <roland@purestorage.com>
+
+commit 6f3603367b8f7c34598fdfc1058622e0e1951e98 upstream.
+
+Since commit 96104eda0169 ("RDMA/core: Add SRQ type field"), kernel
+users of SRQs need to specify srq_type = IB_SRQT_BASIC in struct
+ib_srq_init_attr, or else most low-level drivers will fail in
+when srpt_add_one() calls ib_create_srq() and gets -ENOSYS.
+
+(mlx4_ib works OK nearly all of the time, because it just needs
+srq_type != IB_SRQT_XRC. And apparently nearly everyone using
+ib_srpt is using mlx4 hardware)
+
+Reported-by: Alexey Shvetsov <alexxy@gentoo.org>
+Signed-off-by: Roland Dreier <roland@purestorage.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/infiniband/ulp/srpt/ib_srpt.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
+@@ -3225,6 +3225,7 @@ static void srpt_add_one(struct ib_devic
+ srq_attr.attr.max_wr = sdev->srq_size;
+ srq_attr.attr.max_sge = 1;
+ srq_attr.attr.srq_limit = 0;
++ srq_attr.srq_type = IB_SRQT_BASIC;
+
+ sdev->srq = ib_create_srq(sdev->pd, &srq_attr);
+ if (IS_ERR(sdev->srq))
--- /dev/null
+From 6f103929f8979d2638e58d7f7fda0beefcb8ee7e Mon Sep 17 00:00:00 2001
+From: Neal Cardwell <ncardwell@google.com>
+Date: Tue, 27 Mar 2012 15:09:37 -0400
+Subject: nohz: Fix stale jiffies update in tick_nohz_restart()
+
+From: Neal Cardwell <ncardwell@google.com>
+
+commit 6f103929f8979d2638e58d7f7fda0beefcb8ee7e upstream.
+
+Fix tick_nohz_restart() to not use a stale ktime_t "now" value when
+calling tick_do_update_jiffies64(now).
+
+If we reach this point in the loop it means that we crossed a tick
+boundary since we grabbed the "now" timestamp, so at this point "now"
+refers to a time in the old jiffy, so using the old value for "now" is
+incorrect, and is likely to give us a stale jiffies value.
+
+In particular, the first time through the loop the
+tick_do_update_jiffies64(now) call is always a no-op, since the
+caller, tick_nohz_restart_sched_tick(), will have already called
+tick_do_update_jiffies64(now) with that "now" value.
+
+Note that tick_nohz_stop_sched_tick() already uses the correct
+approach: when we notice we cross a jiffy boundary, grab a new
+timestamp with ktime_get(), and *then* update jiffies.
+
+Signed-off-by: Neal Cardwell <ncardwell@google.com>
+Cc: Ben Segall <bsegall@google.com>
+Cc: Ingo Molnar <mingo@elte.hu>
+Link: http://lkml.kernel.org/r/1332875377-23014-1-git-send-email-ncardwell@google.com
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/time/tick-sched.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -538,9 +538,9 @@ static void tick_nohz_restart(struct tic
+ hrtimer_get_expires(&ts->sched_timer), 0))
+ break;
+ }
+- /* Update jiffies and reread time */
+- tick_do_update_jiffies64(now);
++ /* Reread time and update jiffies */
+ now = ktime_get();
++ tick_do_update_jiffies64(now);
+ }
+ }
+
--- /dev/null
+From 867c902e07d5677e2a5b54c0435e589513abde48 Mon Sep 17 00:00:00 2001
+From: Tomoya MORINAGA <tomoya.rohm@gmail.com>
+Date: Mon, 2 Apr 2012 14:36:22 +0900
+Subject: pch_uart: Fix MSI setting issue
+
+From: Tomoya MORINAGA <tomoya.rohm@gmail.com>
+
+commit 867c902e07d5677e2a5b54c0435e589513abde48 upstream.
+
+The following patch (MSI setting) is not enough.
+
+commit e463595fd9c752fa4bf06b47df93ef9ade3c7cf0
+Author: Alexander Stein <alexander.stein@systec-electronic.com>
+Date: Mon Jul 4 08:58:31 2011 +0200
+
+ pch_uart: Add MSI support
+
+ Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
+ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+To enable MSI mode, PCI bus-mastering must be enabled.
+This patch enables the setting.
+
+cc: Alexander Stein <alexander.stein@systec-electronic.com>
+Signed-off-by: Tomoya MORINAGA <tomoya.rohm@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/tty/serial/pch_uart.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/tty/serial/pch_uart.c
++++ b/drivers/tty/serial/pch_uart.c
+@@ -1586,6 +1586,7 @@ static struct eg20t_port *pch_uart_init_
+ }
+
+ pci_enable_msi(pdev);
++ pci_set_master(pdev);
+
+ iobase = pci_resource_start(pdev, 0);
+ mapbase = pci_resource_start(pdev, 1);
--- /dev/null
+From 63fa471dd49e9c9ce029d910d1024330d9b1b145 Mon Sep 17 00:00:00 2001
+From: David Miller <davem@davemloft.net>
+Date: Tue, 27 Mar 2012 03:14:18 -0400
+Subject: perf hists: Catch and handle out-of-date hist entry maps.
+
+From: David Miller <davem@davemloft.net>
+
+commit 63fa471dd49e9c9ce029d910d1024330d9b1b145 upstream.
+
+When a process exec()'s, all the maps are retired, but we keep the hist
+entries around which hold references to those outdated maps.
+
+If the same library gets mapped in for which we have hist entries, a new
+map will be created. But when we take a perf entry hit within that map,
+we'll find the existing hist entry with the older map.
+
+This causes symbol translations to be done incorrectly. For example,
+the perf entry processing will lookup the correct uptodate map entry and
+use that to calculate the symbol and DSO relative address. But later
+when we update the histogram we'll translate the address using the
+outdated map file instead leading to conditions such as out-of-range
+offsets in symbol__inc_addr_samples().
+
+Therefore, update the map of the hist_entry dynamically at lookup/
+creation time.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Link: http://lkml.kernel.org/r/20120327.031418.1220315351537060808.davem@davemloft.net
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/perf/util/hist.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/tools/perf/util/hist.c
++++ b/tools/perf/util/hist.c
+@@ -230,6 +230,18 @@ struct hist_entry *__hists__add_entry(st
+ if (!cmp) {
+ he->period += period;
+ ++he->nr_events;
++
++ /* If the map of an existing hist_entry has
++ * become out-of-date due to an exec() or
++ * similar, update it. Otherwise we will
++ * mis-adjust symbol addresses when computing
++ * the history counter to increment.
++ */
++ if (he->ms.map != entry->ms.map) {
++ he->ms.map = entry->ms.map;
++ if (he->ms.map)
++ he->ms.map->referenced = true;
++ }
+ goto out;
+ }
+
sparc64-fix-bootup-crash-on-sun4v.patch
cciss-initialize-scsi-host-max_sectors-for-tape-drive-support.patch
cciss-fix-scsi-tape-io-with-more-than-255-scatter-gather-elements.patch
+perf-hists-catch-and-handle-out-of-date-hist-entry-maps.patch
+video-uvesafb-fix-oops-that-uvesafb-try-to-execute-nx-protected-page.patch
+ib-srpt-set-srq_type-to-ib_srqt_basic.patch
+nohz-fix-stale-jiffies-update-in-tick_nohz_restart.patch
+pch_uart-fix-msi-setting-issue.patch
+x86-use-correct-byte-sized-register-constraint-in.patch
+x86-use-correct-byte-sized-register-constraint-in-__add.patch
+usb-serial-fix-race-between-probe-and-open.patch
+usb-pl2303-fix-dtr-rts-being-raised-on-baud-rate-change.patch
+usb-option-re-add-novatelwireless_product_hspa_highspeed-to-option_id-array.patch
+usb-ftdi_sio-fix-status-line-change-handling-for-tiocmiwait-and-tiocgicount.patch
+usb-ftdi_sio-fix-race-condition-in-tiocmiwait-and-abort-of-tiocmiwait-when-the-device-is-removed.patch
+usb-sierra-add-support-for-sierra-wireless-mc7710.patch
+usb-don-t-clear-urb-dev-in-scatter-gather-library.patch
+usb-don-t-ignore-suspend-errors-for-root-hubs.patch
+usb-serial-metro-usb-fix-idproduct-for-uni-directional-mode.patch
--- /dev/null
+From bcf398537630bf20b4dbe59ba855b69f404c93cf Mon Sep 17 00:00:00 2001
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Thu, 22 Mar 2012 11:00:21 -0400
+Subject: USB: don't clear urb->dev in scatter-gather library
+
+From: Alan Stern <stern@rowland.harvard.edu>
+
+commit bcf398537630bf20b4dbe59ba855b69f404c93cf upstream.
+
+This patch (as1517b) fixes an error in the USB scatter-gather library.
+The library code uses urb->dev to determine whether or nor an URB is
+currently active; the completion handler sets urb->dev to NULL.
+However the core unlinking routines need to use urb->dev. Since
+unlinking always racing with completion, the completion handler must
+not clear urb->dev -- it can lead to invalid memory accesses when a
+transfer has to be cancelled.
+
+This patch fixes the problem by getting rid of the lines that clear
+urb->dev after urb has been submitted. As a result we may end up
+trying to unlink an URB that failed in submission or that has already
+completed, so an extra check is added after each unlink to avoid
+printing an error message when this happens. The checks are updated
+in both sg_complete() and sg_cancel(), and the second is updated to
+match the first (currently it prints out unnecessary warning messages
+if a device is unplugged while a transfer is in progress).
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Reported-and-tested-by: Illia Zaitsev <I.Zaitsev@adbglobal.com>
+CC: Ming Lei <tom.leiming@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/core/message.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/core/message.c
++++ b/drivers/usb/core/message.c
+@@ -308,7 +308,8 @@ static void sg_complete(struct urb *urb)
+ retval = usb_unlink_urb(io->urbs [i]);
+ if (retval != -EINPROGRESS &&
+ retval != -ENODEV &&
+- retval != -EBUSY)
++ retval != -EBUSY &&
++ retval != -EIDRM)
+ dev_err(&io->dev->dev,
+ "%s, unlink --> %d\n",
+ __func__, retval);
+@@ -317,7 +318,6 @@ static void sg_complete(struct urb *urb)
+ }
+ spin_lock(&io->lock);
+ }
+- urb->dev = NULL;
+
+ /* on the last completion, signal usb_sg_wait() */
+ io->bytes += urb->actual_length;
+@@ -524,7 +524,6 @@ void usb_sg_wait(struct usb_sg_request *
+ case -ENXIO: /* hc didn't queue this one */
+ case -EAGAIN:
+ case -ENOMEM:
+- io->urbs[i]->dev = NULL;
+ retval = 0;
+ yield();
+ break;
+@@ -542,7 +541,6 @@ void usb_sg_wait(struct usb_sg_request *
+
+ /* fail any uncompleted urbs */
+ default:
+- io->urbs[i]->dev = NULL;
+ io->urbs[i]->status = retval;
+ dev_dbg(&io->dev->dev, "%s, submit --> %d\n",
+ __func__, retval);
+@@ -593,7 +591,10 @@ void usb_sg_cancel(struct usb_sg_request
+ if (!io->urbs [i]->dev)
+ continue;
+ retval = usb_unlink_urb(io->urbs [i]);
+- if (retval != -EINPROGRESS && retval != -EBUSY)
++ if (retval != -EINPROGRESS
++ && retval != -ENODEV
++ && retval != -EBUSY
++ && retval != -EIDRM)
+ dev_warn(&io->dev->dev, "%s, unlink --> %d\n",
+ __func__, retval);
+ }
--- /dev/null
+From cd4376e23a59a2adf3084cb5f4a523e6d5fd4e49 Mon Sep 17 00:00:00 2001
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Wed, 28 Mar 2012 15:56:17 -0400
+Subject: USB: don't ignore suspend errors for root hubs
+
+From: Alan Stern <stern@rowland.harvard.edu>
+
+commit cd4376e23a59a2adf3084cb5f4a523e6d5fd4e49 upstream.
+
+This patch (as1532) fixes a mistake in the USB suspend code. When the
+system is going to sleep, we should ignore errors in powering down USB
+devices, because they don't really matter. The devices will go to low
+power anyway when the entire USB bus gets suspended (except for
+SuperSpeed devices; maybe they will need special treatment later).
+
+However we should not ignore errors in suspending root hubs,
+especially if the error indicates that the suspend raced with a wakeup
+request. Doing so might leave the bus powered on while the system was
+supposed to be asleep, or it might cause the suspend of the root hub's
+parent controller device to fail, or it might cause a wakeup request
+to be ignored.
+
+The patch fixes the problem by ignoring errors only when the device in
+question is not a root hub.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Reported-by: Chen Peter <B29397@freescale.com>
+Tested-by: Chen Peter <peter.chen@freescale.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/core/driver.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/core/driver.c
++++ b/drivers/usb/core/driver.c
+@@ -1190,8 +1190,13 @@ static int usb_suspend_both(struct usb_d
+ if (status == 0) {
+ status = usb_suspend_device(udev, msg);
+
+- /* Again, ignore errors during system sleep transitions */
+- if (!PMSG_IS_AUTO(msg))
++ /*
++ * Ignore errors from non-root-hub devices during
++ * system sleep transitions. For the most part,
++ * these devices should go to low power anyway when
++ * the entire bus is suspended.
++ */
++ if (udev->parent && !PMSG_IS_AUTO(msg))
+ status = 0;
+ }
+
--- /dev/null
+From 876ae50d94b02f3f523aa451b45ec5fb9c25d221 Mon Sep 17 00:00:00 2001
+From: Simon Arlott <simon@fire.lp0.eu>
+Date: Mon, 26 Mar 2012 23:27:59 +0100
+Subject: USB: ftdi_sio: fix race condition in TIOCMIWAIT, and abort of TIOCMIWAIT when the device is removed
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Simon Arlott <simon@fire.lp0.eu>
+
+commit 876ae50d94b02f3f523aa451b45ec5fb9c25d221 upstream.
+
+There are two issues here, one is that the device is generating
+spurious very fast modem status line changes somewhere:
+
+CTS becomes high then low 18µs later:
+[121226.924373] ftdi_process_packet: prev rng=0 dsr=10 dcd=0 cts=6
+[121226.924378] ftdi_process_packet: status=10 prev=00 diff=10
+[121226.924382] ftdi_process_packet: now rng=0 dsr=10 dcd=0 cts=7
+(wake_up_interruptible is called)
+[121226.924391] ftdi_process_packet: prev rng=0 dsr=10 dcd=0 cts=7
+[121226.924394] ftdi_process_packet: status=00 prev=10 diff=10
+[121226.924397] ftdi_process_packet: now rng=0 dsr=10 dcd=0 cts=8
+(wake_up_interruptible is called)
+
+This wakes up the task in TIOCMIWAIT:
+[121226.924405] ftdi_ioctl: 19451 rng=0->0 dsr=10->10 dcd=0->0 cts=6->8
+(wait from 20:51:46 returns and observes both changes)
+
+Which then calls TIOCMIWAIT again:
+20:51:46.400239 ioctl(3, TIOCMIWAIT, 0x20) = 0
+22:11:09.441818 ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS]) = 0
+22:11:09.442812 ioctl(3, TIOCMIWAIT, 0x20) = -1 EIO (Input/output error)
+(the second wake_up_interruptible takes effect and an I/O error occurs)
+
+The other issue is that TIOCMIWAIT will wait forever (unless the task is
+interrupted) if the device is removed.
+
+This change removes the -EIO return that occurs if the counts don't
+appear to have changed. Multiple counts may have been processed as
+one or the waiting task may have started waiting after recording the
+current count.
+
+It adds a bool to indicate that the device has been removed so that
+TIOCMIWAIT doesn't wait forever, and wakes up any tasks so that they can
+return -EIO.
+
+Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -76,6 +76,7 @@ struct ftdi_private {
+ struct async_icount icount;
+ wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
+ char prev_status; /* Used for TIOCMIWAIT */
++ bool dev_gone; /* Used to abort TIOCMIWAIT */
+ char transmit_empty; /* If transmitter is empty or not */
+ struct usb_serial_port *port;
+ __u16 interface; /* FT2232C, FT2232H or FT4232H port interface
+@@ -1679,6 +1680,7 @@ static int ftdi_sio_port_probe(struct us
+ init_waitqueue_head(&priv->delta_msr_wait);
+
+ priv->flags = ASYNC_LOW_LATENCY;
++ priv->dev_gone = false;
+
+ if (quirk && quirk->port_probe)
+ quirk->port_probe(priv);
+@@ -1836,6 +1838,9 @@ static int ftdi_sio_port_remove(struct u
+
+ dbg("%s", __func__);
+
++ priv->dev_gone = true;
++ wake_up_interruptible_all(&priv->delta_msr_wait);
++
+ remove_sysfs_attrs(port);
+
+ kref_put(&priv->kref, ftdi_sio_priv_release);
+@@ -2394,15 +2399,12 @@ static int ftdi_ioctl(struct tty_struct
+ */
+ case TIOCMIWAIT:
+ cprev = priv->icount;
+- while (1) {
++ while (!priv->dev_gone) {
+ interruptible_sleep_on(&priv->delta_msr_wait);
+ /* see if a signal did it */
+ if (signal_pending(current))
+ return -ERESTARTSYS;
+ cnow = priv->icount;
+- if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
+- cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
+- return -EIO; /* no change => error */
+ if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
+ ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
+ ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
+@@ -2411,7 +2413,7 @@ static int ftdi_ioctl(struct tty_struct
+ }
+ cprev = cnow;
+ }
+- /* not reached */
++ return -EIO;
+ break;
+ case TIOCSERGETLSR:
+ return get_lsr_info(port, (struct serial_struct __user *)arg);
--- /dev/null
+From fca5430d48d53eaf103498c33fd0d1984b9f448b Mon Sep 17 00:00:00 2001
+From: Simon Arlott <simon@fire.lp0.eu>
+Date: Mon, 26 Mar 2012 21:19:40 +0100
+Subject: USB: ftdi_sio: fix status line change handling for TIOCMIWAIT and TIOCGICOUNT
+
+From: Simon Arlott <simon@fire.lp0.eu>
+
+commit fca5430d48d53eaf103498c33fd0d1984b9f448b upstream.
+
+Handling of TIOCMIWAIT was changed by commit 1d749f9afa657f6ee9336b2bc1fcd750a647d157
+ USB: ftdi_sio.c: Use ftdi async_icount structure for TIOCMIWAIT, as in other drivers
+
+FTDI_STATUS_B0_MASK does not indicate the changed modem status lines,
+it indicates the value of the current modem status lines. An xor is
+still required to determine which lines have changed.
+
+The count was only being incremented if the line was high. The only
+reason TIOCMIWAIT still worked was because the status packet is
+repeated every 1ms, so the count was always changing. The wakeup
+itself still ran based on the status lines changing.
+
+This change fixes handling of updates to the modem status lines and
+allows multiple processes to use TIOCMIWAIT concurrently.
+
+Tested with two processes waiting on different status lines being
+toggled independently.
+
+Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
+Cc: Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -75,7 +75,7 @@ struct ftdi_private {
+ unsigned long last_dtr_rts; /* saved modem control outputs */
+ struct async_icount icount;
+ wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
+- char prev_status, diff_status; /* Used for TIOCMIWAIT */
++ char prev_status; /* Used for TIOCMIWAIT */
+ char transmit_empty; /* If transmitter is empty or not */
+ struct usb_serial_port *port;
+ __u16 interface; /* FT2232C, FT2232H or FT4232H port interface
+@@ -1979,17 +1979,19 @@ static int ftdi_process_packet(struct tt
+ N.B. packet may be processed more than once, but differences
+ are only processed once. */
+ status = packet[0] & FTDI_STATUS_B0_MASK;
+- if (status & FTDI_RS0_CTS)
+- priv->icount.cts++;
+- if (status & FTDI_RS0_DSR)
+- priv->icount.dsr++;
+- if (status & FTDI_RS0_RI)
+- priv->icount.rng++;
+- if (status & FTDI_RS0_RLSD)
+- priv->icount.dcd++;
+ if (status != priv->prev_status) {
+- priv->diff_status |= status ^ priv->prev_status;
+- wake_up_interruptible(&priv->delta_msr_wait);
++ char diff_status = status ^ priv->prev_status;
++
++ if (diff_status & FTDI_RS0_CTS)
++ priv->icount.cts++;
++ if (diff_status & FTDI_RS0_DSR)
++ priv->icount.dsr++;
++ if (diff_status & FTDI_RS0_RI)
++ priv->icount.rng++;
++ if (diff_status & FTDI_RS0_RLSD)
++ priv->icount.dcd++;
++
++ wake_up_interruptible_all(&priv->delta_msr_wait);
+ priv->prev_status = status;
+ }
+
--- /dev/null
+From 9ac2feb22b5b821d81463bef92698ef7682a3145 Mon Sep 17 00:00:00 2001
+From: Santiago Garcia Mantinan <manty@debian.org>
+Date: Mon, 19 Mar 2012 18:17:00 +0100
+Subject: USB: option: re-add NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED to option_id array
+
+From: Santiago Garcia Mantinan <manty@debian.org>
+
+commit 9ac2feb22b5b821d81463bef92698ef7682a3145 upstream.
+
+Re-add NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED to option_id array
+
+Signed-off-by: Santiago Garcia Mantinan <manty@debian.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/option.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -708,6 +708,7 @@ static const struct usb_device_id option
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) },
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED3) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED4) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED5) },
--- /dev/null
+From ce5c9851855bab190c9a142761d54ba583ab094c Mon Sep 17 00:00:00 2001
+From: Johan Hovold <jhovold@gmail.com>
+Date: Fri, 23 Mar 2012 15:23:18 +0100
+Subject: USB: pl2303: fix DTR/RTS being raised on baud rate change
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Johan Hovold <jhovold@gmail.com>
+
+commit ce5c9851855bab190c9a142761d54ba583ab094c upstream.
+
+DTR/RTS should only be raised when changing baudrate from B0 and not on
+any baud rate change (> B0).
+
+Reported-by: Søren Holm <sgh@sgh.dk>
+Signed-off-by: Johan Hovold <jhovold@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/pl2303.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/pl2303.c
++++ b/drivers/usb/serial/pl2303.c
+@@ -421,7 +421,7 @@ static void pl2303_set_termios(struct tt
+ control = priv->line_control;
+ if ((cflag & CBAUD) == B0)
+ priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
+- else
++ else if ((old_termios->c_cflag & CBAUD) == B0)
+ priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
+ if (control != priv->line_control) {
+ control = priv->line_control;
--- /dev/null
+From a65a6f14dc24a90bde3f5d0073ba2364476200bf Mon Sep 17 00:00:00 2001
+From: Johan Hovold <jhovold@gmail.com>
+Date: Tue, 20 Mar 2012 16:59:33 +0100
+Subject: USB: serial: fix race between probe and open
+
+From: Johan Hovold <jhovold@gmail.com>
+
+commit a65a6f14dc24a90bde3f5d0073ba2364476200bf upstream.
+
+Fix race between probe and open by making sure that the disconnected
+flag is not cleared until all ports have been registered.
+
+A call to tty_open while probe is running may get a reference to the
+serial structure in serial_install before its ports have been
+registered. This may lead to usb_serial_core calling driver open before
+port is fully initialised.
+
+With ftdi_sio this result in the following NULL-pointer dereference as
+the private data has not been initialised at open:
+
+[ 199.698286] IP: [<f811a089>] ftdi_open+0x59/0xe0 [ftdi_sio]
+[ 199.698297] *pde = 00000000
+[ 199.698303] Oops: 0000 [#1] PREEMPT SMP
+[ 199.698313] Modules linked in: ftdi_sio usbserial
+[ 199.698323]
+[ 199.698327] Pid: 1146, comm: ftdi_open Not tainted 3.2.11 #70 Dell Inc. Vostro 1520/0T816J
+[ 199.698339] EIP: 0060:[<f811a089>] EFLAGS: 00010286 CPU: 0
+[ 199.698344] EIP is at ftdi_open+0x59/0xe0 [ftdi_sio]
+[ 199.698348] EAX: 0000003e EBX: f5067000 ECX: 00000000 EDX: 80000600
+[ 199.698352] ESI: f48d8800 EDI: 00000001 EBP: f515dd54 ESP: f515dcfc
+[ 199.698356] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
+[ 199.698361] Process ftdi_open (pid: 1146, ti=f515c000 task=f481e040 task.ti=f515c000)
+[ 199.698364] Stack:
+[ 199.698368] f811a9fe f811a9e0 f811b3ef 00000000 00000000 00001388 00000000 f4a86800
+[ 199.698387] 00000002 00000000 f806e68e 00000000 f532765c f481e040 00000246 22222222
+[ 199.698479] 22222222 22222222 22222222 f5067004 f5327600 f5327638 f515dd74 f806e6ab
+[ 199.698496] Call Trace:
+[ 199.698504] [<f806e68e>] ? serial_activate+0x2e/0x70 [usbserial]
+[ 199.698511] [<f806e6ab>] serial_activate+0x4b/0x70 [usbserial]
+[ 199.698521] [<c126380c>] tty_port_open+0x7c/0xd0
+[ 199.698527] [<f806e660>] ? serial_set_termios+0xa0/0xa0 [usbserial]
+[ 199.698534] [<f806e76f>] serial_open+0x2f/0x70 [usbserial]
+[ 199.698540] [<c125d07c>] tty_open+0x20c/0x510
+[ 199.698546] [<c10e9eb7>] chrdev_open+0xe7/0x230
+[ 199.698553] [<c10e48f2>] __dentry_open+0x1f2/0x390
+[ 199.698559] [<c144bfec>] ? _raw_spin_unlock+0x2c/0x50
+[ 199.698565] [<c10e4b76>] nameidata_to_filp+0x66/0x80
+[ 199.698570] [<c10e9dd0>] ? cdev_put+0x20/0x20
+[ 199.698576] [<c10f3e08>] do_last+0x198/0x730
+[ 199.698581] [<c10f4440>] path_openat+0xa0/0x350
+[ 199.698587] [<c10f47d5>] do_filp_open+0x35/0x80
+[ 199.698593] [<c144bfec>] ? _raw_spin_unlock+0x2c/0x50
+[ 199.698599] [<c10ff110>] ? alloc_fd+0xc0/0x100
+[ 199.698605] [<c10f0b72>] ? getname_flags+0x72/0x120
+[ 199.698611] [<c10e4450>] do_sys_open+0xf0/0x1c0
+[ 199.698617] [<c11fcc08>] ? trace_hardirqs_on_thunk+0xc/0x10
+[ 199.698623] [<c10e458e>] sys_open+0x2e/0x40
+[ 199.698628] [<c144c990>] sysenter_do_call+0x12/0x36
+[ 199.698632] Code: 85 89 00 00 00 8b 16 8b 4d c0 c1 e2 08 c7 44 24 14 88 13 00 00 81 ca 00 00 00 80 c7 44 24 10 00 00 00 00 c7 44 24 0c 00 00 00 00 <0f> b7 41 78 31 c9 89 44 24 08 c7 44 24 04 00 00 00 00 c7 04 24
+[ 199.698884] EIP: [<f811a089>] ftdi_open+0x59/0xe0 [ftdi_sio] SS:ESP 0068:f515dcfc
+[ 199.698893] CR2: 0000000000000078
+[ 199.698925] ---[ end trace 77c43ec023940cff ]---
+
+Reported-and-tested-by: Ken Huang <csuhgw@gmail.com>
+Signed-off-by: Johan Hovold <jhovold@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/usb-serial.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -1063,6 +1063,12 @@ int usb_serial_probe(struct usb_interfac
+ serial->attached = 1;
+ }
+
++ /* Avoid race with tty_open and serial_install by setting the
++ * disconnected flag and not clearing it until all ports have been
++ * registered.
++ */
++ serial->disconnected = 1;
++
+ if (get_free_serial(serial, num_ports, &minor) == NULL) {
+ dev_err(&interface->dev, "No more free serial devices\n");
+ goto probe_error;
+@@ -1087,6 +1093,8 @@ int usb_serial_probe(struct usb_interfac
+ }
+ }
+
++ serial->disconnected = 0;
++
+ usb_serial_console_init(debug, minor);
+
+ exit:
--- /dev/null
+From 3a450850e2bb0f92cacb12da90fe98eccd105468 Mon Sep 17 00:00:00 2001
+From: Aleksey Babahin <tamerlan311@gmail.com>
+Date: Tue, 20 Mar 2012 00:46:31 +0400
+Subject: USB: serial: metro-usb: Fix idProduct for Uni-Directional mode.
+
+From: Aleksey Babahin <tamerlan311@gmail.com>
+
+commit 3a450850e2bb0f92cacb12da90fe98eccd105468 upstream.
+
+The right idProduct for Metrologic Bar Code Scanner
+in Uni-Directional Serial Emulation mode is 0x0700.
+
+Also rename idProduct for Bi-Directional mode to be a bit more informative.
+
+Signed-off-by: Aleksey Babahin <tamerlan311@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c
+index 6e1622f..08d16e8 100644
+--- a/drivers/usb/serial/metro-usb.c
++++ b/drivers/usb/serial/metro-usb.c
+@@ -27,8 +27,8 @@
+
+ /* Product information. */
+ #define FOCUS_VENDOR_ID 0x0C2E
+-#define FOCUS_PRODUCT_ID 0x0720
+-#define FOCUS_PRODUCT_ID_UNI 0x0710
++#define FOCUS_PRODUCT_ID_BI 0x0720
++#define FOCUS_PRODUCT_ID_UNI 0x0700
+
+ #define METROUSB_SET_REQUEST_TYPE 0x40
+ #define METROUSB_SET_MODEM_CTRL_REQUEST 10
+@@ -47,7 +47,7 @@ struct metrousb_private {
+
+ /* Device table list. */
+ static struct usb_device_id id_table[] = {
+- { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID) },
++ { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_BI) },
+ { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_UNI) },
+ { }, /* Terminating entry. */
+ };
--- /dev/null
+From c5d703dcc776cb542b41665f2b7e2ba054efb4a7 Mon Sep 17 00:00:00 2001
+From: Anton Samokhvalov <pg83@yandex.ru>
+Date: Wed, 4 Apr 2012 22:26:01 +0400
+Subject: USB: sierra: add support for Sierra Wireless MC7710
+
+From: Anton Samokhvalov <pg83@yandex.ru>
+
+commit c5d703dcc776cb542b41665f2b7e2ba054efb4a7 upstream.
+
+Just add new device id. 3G works fine, LTE not tested.
+
+Signed-off-by: Anton Samokhvalov <pg83@yandex.ru>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/sierra.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -289,6 +289,7 @@ static const struct usb_device_id id_tab
+ { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
+ { USB_DEVICE(0x1199, 0x6859) }, /* Sierra Wireless AirCard 885 E */
+ { USB_DEVICE(0x1199, 0x685A) }, /* Sierra Wireless AirCard 885 E */
++ { USB_DEVICE(0x1199, 0x68A2) }, /* Sierra Wireless MC7710 */
+ /* Sierra Wireless C885 */
+ { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6880, 0xFF, 0xFF, 0xFF)},
+ /* Sierra Wireless C888, Air Card 501, USB 303, USB 304 */
--- /dev/null
+From b78f29ca0516266431688c5eb42d39ce42ec039a Mon Sep 17 00:00:00 2001
+From: Wang YanQing <udknight@gmail.com>
+Date: Sun, 1 Apr 2012 08:54:02 +0800
+Subject: video:uvesafb: Fix oops that uvesafb try to execute NX-protected page
+
+From: Wang YanQing <udknight@gmail.com>
+
+commit b78f29ca0516266431688c5eb42d39ce42ec039a upstream.
+
+This patch fix the oops below that catched in my machine
+
+[ 81.560602] uvesafb: NVIDIA Corporation, GT216 Board - 0696a290, Chip Rev , OEM: NVIDIA, VBE v3.0
+[ 81.609384] uvesafb: protected mode interface info at c000:d350
+[ 81.609388] uvesafb: pmi: set display start = c00cd3b3, set palette = c00cd40e
+[ 81.609390] uvesafb: pmi: ports = 3b4 3b5 3ba 3c0 3c1 3c4 3c5 3c6 3c7 3c8 3c9 3cc 3ce 3cf 3d0 3d1 3d2 3d3 3d4 3d5 3da
+[ 81.614558] uvesafb: VBIOS/hardware doesn't support DDC transfers
+[ 81.614562] uvesafb: no monitor limits have been set, default refresh rate will be used
+[ 81.614994] uvesafb: scrolling: ypan using protected mode interface, yres_virtual=4915
+[ 81.744147] kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
+[ 81.744153] BUG: unable to handle kernel paging request at c00cd3b3
+[ 81.744159] IP: [<c00cd3b3>] 0xc00cd3b2
+[ 81.744167] *pdpt = 00000000016d6001 *pde = 0000000001c7b067 *pte = 80000000000cd163
+[ 81.744171] Oops: 0011 [#1] SMP
+[ 81.744174] Modules linked in: uvesafb(+) cfbcopyarea cfbimgblt cfbfillrect
+[ 81.744178]
+[ 81.744181] Pid: 3497, comm: modprobe Not tainted 3.3.0-rc4NX+ #71 Acer Aspire 4741 /Aspire 4741
+[ 81.744185] EIP: 0060:[<c00cd3b3>] EFLAGS: 00010246 CPU: 0
+[ 81.744187] EIP is at 0xc00cd3b3
+[ 81.744189] EAX: 00004f07 EBX: 00000000 ECX: 00000000 EDX: 00000000
+[ 81.744191] ESI: f763f000 EDI: f763f6e8 EBP: f57f3a0c ESP: f57f3a00
+[ 81.744192] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
+[ 81.744195] Process modprobe (pid: 3497, ti=f57f2000 task=f748c600 task.ti=f57f2000)
+[ 81.744196] Stack:
+[ 81.744197] f82512c5 f759341c 00000000 f57f3a30 c124a9bc 00000001 00000001 000001e0
+[ 81.744202] f8251280 f763f000 f7593400 00000000 f57f3a40 c12598dd f5c0c000 00000000
+[ 81.744206] f57f3b10 c1255efe c125a21a 00000006 f763f09c 00000000 c1c6cb60 f7593400
+[ 81.744210] Call Trace:
+[ 81.744215] [<f82512c5>] ? uvesafb_pan_display+0x45/0x60 [uvesafb]
+[ 81.744222] [<c124a9bc>] fb_pan_display+0x10c/0x160
+[ 81.744226] [<f8251280>] ? uvesafb_vbe_find_mode+0x180/0x180 [uvesafb]
+[ 81.744230] [<c12598dd>] bit_update_start+0x1d/0x50
+[ 81.744232] [<c1255efe>] fbcon_switch+0x39e/0x550
+[ 81.744235] [<c125a21a>] ? bit_cursor+0x4ea/0x560
+[ 81.744240] [<c129b6cb>] redraw_screen+0x12b/0x220
+[ 81.744245] [<c128843b>] ? tty_do_resize+0x3b/0xc0
+[ 81.744247] [<c129ef42>] vc_do_resize+0x3d2/0x3e0
+[ 81.744250] [<c129efb4>] vc_resize+0x14/0x20
+[ 81.744253] [<c12586bd>] fbcon_init+0x29d/0x500
+[ 81.744255] [<c12984c4>] ? set_inverse_trans_unicode+0xe4/0x110
+[ 81.744258] [<c129b378>] visual_init+0xb8/0x150
+[ 81.744261] [<c129c16c>] bind_con_driver+0x16c/0x360
+[ 81.744264] [<c129b47e>] ? register_con_driver+0x6e/0x190
+[ 81.744267] [<c129c3a1>] take_over_console+0x41/0x50
+[ 81.744269] [<c1257b7a>] fbcon_takeover+0x6a/0xd0
+[ 81.744272] [<c12594b8>] fbcon_event_notify+0x758/0x790
+[ 81.744277] [<c10929e2>] notifier_call_chain+0x42/0xb0
+[ 81.744280] [<c1092d30>] __blocking_notifier_call_chain+0x60/0x90
+[ 81.744283] [<c1092d7a>] blocking_notifier_call_chain+0x1a/0x20
+[ 81.744285] [<c124a5a1>] fb_notifier_call_chain+0x11/0x20
+[ 81.744288] [<c124b759>] register_framebuffer+0x1d9/0x2b0
+[ 81.744293] [<c1061c73>] ? ioremap_wc+0x33/0x40
+[ 81.744298] [<f82537c6>] uvesafb_probe+0xaba/0xc40 [uvesafb]
+[ 81.744302] [<c12bb81f>] platform_drv_probe+0xf/0x20
+[ 81.744306] [<c12ba558>] driver_probe_device+0x68/0x170
+[ 81.744309] [<c12ba731>] __device_attach+0x41/0x50
+[ 81.744313] [<c12b9088>] bus_for_each_drv+0x48/0x70
+[ 81.744316] [<c12ba7f3>] device_attach+0x83/0xa0
+[ 81.744319] [<c12ba6f0>] ? __driver_attach+0x90/0x90
+[ 81.744321] [<c12b991f>] bus_probe_device+0x6f/0x90
+[ 81.744324] [<c12b8a45>] device_add+0x5e5/0x680
+[ 81.744329] [<c122a1a3>] ? kvasprintf+0x43/0x60
+[ 81.744332] [<c121e6e4>] ? kobject_set_name_vargs+0x64/0x70
+[ 81.744335] [<c121e6e4>] ? kobject_set_name_vargs+0x64/0x70
+[ 81.744339] [<c12bbe9f>] platform_device_add+0xff/0x1b0
+[ 81.744343] [<f8252906>] uvesafb_init+0x50/0x9b [uvesafb]
+[ 81.744346] [<c100111f>] do_one_initcall+0x2f/0x170
+[ 81.744350] [<f82528b6>] ? uvesafb_is_valid_mode+0x66/0x66 [uvesafb]
+[ 81.744355] [<c10c6994>] sys_init_module+0xf4/0x1410
+[ 81.744359] [<c1157fc0>] ? vfsmount_lock_local_unlock_cpu+0x30/0x30
+[ 81.744363] [<c144cb10>] sysenter_do_call+0x12/0x36
+[ 81.744365] Code: f5 00 00 00 32 f6 66 8b da 66 d1 e3 66 ba d4 03 8a e3 b0 1c 66 ef b0 1e 66 ef 8a e7 b0 1d 66 ef b0 1f 66 ef e8 fa 00 00 00 61 c3 <60> e8 c8 00 00 00 66 8b f3 66 8b da 66 ba d4 03 b0 0c 8a e5 66
+[ 81.744388] EIP: [<c00cd3b3>] 0xc00cd3b3 SS:ESP 0068:f57f3a00
+[ 81.744391] CR2: 00000000c00cd3b3
+[ 81.744393] ---[ end trace 18b2c87c925b54d6 ]---
+
+Signed-off-by: Wang YanQing <udknight@gmail.com>
+Cc: Michal Januszewski <spock@gentoo.org>
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
+Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/video/uvesafb.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+--- a/drivers/video/uvesafb.c
++++ b/drivers/video/uvesafb.c
+@@ -815,8 +815,15 @@ static int __devinit uvesafb_vbe_init(st
+ par->pmi_setpal = pmi_setpal;
+ par->ypan = ypan;
+
+- if (par->pmi_setpal || par->ypan)
+- uvesafb_vbe_getpmi(task, par);
++ if (par->pmi_setpal || par->ypan) {
++ if (__supported_pte_mask & _PAGE_NX) {
++ par->pmi_setpal = par->ypan = 0;
++ printk(KERN_WARNING "uvesafb: NX protection is actively."
++ "We have better not to use the PMI.\n");
++ } else {
++ uvesafb_vbe_getpmi(task, par);
++ }
++ }
+ #else
+ /* The protected mode interface is not available on non-x86. */
+ par->pmi_setpal = par->ypan = 0;
--- /dev/null
+From 8c91c5325e107ec17e40a59a47c6517387d64eb7 Mon Sep 17 00:00:00 2001
+From: "H. Peter Anvin" <hpa@zytor.com>
+Date: Fri, 6 Apr 2012 09:30:57 -0700
+Subject: x86: Use correct byte-sized register constraint in __add()
+
+From: "H. Peter Anvin" <hpa@zytor.com>
+
+commit 8c91c5325e107ec17e40a59a47c6517387d64eb7 upstream.
+
+Similar to:
+
+ 2ca052a x86: Use correct byte-sized register constraint in __xchg_op()
+
+... the __add() macro also needs to use a "q" constraint in the
+byte-sized case, lest we try to generate an illegal register.
+
+Link: http://lkml.kernel.org/r/4F7A3315.501@goop.org
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+Cc: Jeremy Fitzhardinge <jeremy@goop.org>
+Cc: Leigh Scott <leigh123linux@googlemail.com>
+Cc: Thomas Reitmayr <treitmayr@devbase.at>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/cmpxchg.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/x86/include/asm/cmpxchg.h
++++ b/arch/x86/include/asm/cmpxchg.h
+@@ -173,7 +173,7 @@ extern void __add_wrong_size(void)
+ switch (sizeof(*(ptr))) { \
+ case __X86_CASE_B: \
+ asm volatile (lock "addb %b1, %0\n" \
+- : "+m" (*(ptr)) : "ri" (inc) \
++ : "+m" (*(ptr)) : "qi" (inc) \
+ : "memory", "cc"); \
+ break; \
+ case __X86_CASE_W: \
--- /dev/null
+From 2ca052a3710fac208eee690faefdeb8bbd4586a1 Mon Sep 17 00:00:00 2001
+From: Jeremy Fitzhardinge <jeremy@goop.org>
+Date: Mon, 2 Apr 2012 16:15:33 -0700
+Subject: x86: Use correct byte-sized register constraint in
+ __xchg_op()
+
+From: Jeremy Fitzhardinge <jeremy@goop.org>
+
+commit 2ca052a3710fac208eee690faefdeb8bbd4586a1 upstream.
+
+x86-64 can access the low half of any register, but i386 can only do
+it with a subset of registers. 'r' causes compilation failures on i386,
+but 'q' expresses the constraint properly.
+
+Signed-off-by: Jeremy Fitzhardinge <jeremy@goop.org>
+Link: http://lkml.kernel.org/r/4F7A3315.501@goop.org
+Reported-by: Leigh Scott <leigh123linux@googlemail.com>
+Tested-by: Thomas Reitmayr <treitmayr@devbase.at>
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/cmpxchg.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/x86/include/asm/cmpxchg.h
++++ b/arch/x86/include/asm/cmpxchg.h
+@@ -43,7 +43,7 @@ extern void __add_wrong_size(void)
+ switch (sizeof(*(ptr))) { \
+ case __X86_CASE_B: \
+ asm volatile (lock #op "b %b0, %1\n" \
+- : "+r" (__ret), "+m" (*(ptr)) \
++ : "+q" (__ret), "+m" (*(ptr)) \
+ : : "memory", "cc"); \
+ break; \
+ case __X86_CASE_W: \