From a313e4d929c1078ffde7bc5db0ba95a1df09a054 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 17 Apr 2012 16:50:47 -0700 Subject: [PATCH] 3.3-stable patches added patches: 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 perf-hists-catch-and-handle-out-of-date-hist-entry-maps.patch usb-don-t-clear-urb-dev-in-scatter-gather-library.patch usb-don-t-ignore-suspend-errors-for-root-hubs.patch usb-ftdi_sio-fix-race-condition-in-tiocmiwait-and-abort-of-tiocmiwait-when-the-device-is-removed.patch usb-ftdi_sio-fix-status-line-change-handling-for-tiocmiwait-and-tiocgicount.patch usb-option-re-add-novatelwireless_product_hspa_highspeed-to-option_id-array.patch usb-pl2303-fix-dtr-rts-being-raised-on-baud-rate-change.patch usb-serial-fix-race-between-probe-and-open.patch usb-serial-metro-usb-fix-idproduct-for-uni-directional-mode.patch usb-sierra-add-support-for-sierra-wireless-mc7710.patch video-uvesafb-fix-oops-that-uvesafb-try-to-execute-nx-protected-page.patch x86-use-correct-byte-sized-register-constraint-in-__add.patch x86-use-correct-byte-sized-register-constraint-in.patch --- ...b-srpt-set-srq_type-to-ib_srqt_basic.patch | 36 ++++++ ...-jiffies-update-in-tick_nohz_restart.patch | 51 ++++++++ .../pch_uart-fix-msi-setting-issue.patch | 41 +++++++ ...d-handle-out-of-date-hist-entry-maps.patch | 56 +++++++++ queue-3.3/series | 16 +++ ...ar-urb-dev-in-scatter-gather-library.patch | 83 +++++++++++++ ...-ignore-suspend-errors-for-root-hubs.patch | 52 ++++++++ ...iocmiwait-when-the-device-is-removed.patch | 108 ++++++++++++++++ ...dling-for-tiocmiwait-and-tiocgicount.patch | 76 ++++++++++++ ...ct_hspa_highspeed-to-option_id-array.patch | 28 +++++ ...rts-being-raised-on-baud-rate-change.patch | 34 ++++++ ...rial-fix-race-between-probe-and-open.patch | 95 +++++++++++++++ ...x-idproduct-for-uni-directional-mode.patch | 41 +++++++ ...d-support-for-sierra-wireless-mc7710.patch | 28 +++++ ...afb-try-to-execute-nx-protected-page.patch | 115 ++++++++++++++++++ ...e-sized-register-constraint-in-__add.patch | 38 ++++++ ...ct-byte-sized-register-constraint-in.patch | 36 ++++++ 17 files changed, 934 insertions(+) create mode 100644 queue-3.3/ib-srpt-set-srq_type-to-ib_srqt_basic.patch create mode 100644 queue-3.3/nohz-fix-stale-jiffies-update-in-tick_nohz_restart.patch create mode 100644 queue-3.3/pch_uart-fix-msi-setting-issue.patch create mode 100644 queue-3.3/perf-hists-catch-and-handle-out-of-date-hist-entry-maps.patch create mode 100644 queue-3.3/usb-don-t-clear-urb-dev-in-scatter-gather-library.patch create mode 100644 queue-3.3/usb-don-t-ignore-suspend-errors-for-root-hubs.patch create mode 100644 queue-3.3/usb-ftdi_sio-fix-race-condition-in-tiocmiwait-and-abort-of-tiocmiwait-when-the-device-is-removed.patch create mode 100644 queue-3.3/usb-ftdi_sio-fix-status-line-change-handling-for-tiocmiwait-and-tiocgicount.patch create mode 100644 queue-3.3/usb-option-re-add-novatelwireless_product_hspa_highspeed-to-option_id-array.patch create mode 100644 queue-3.3/usb-pl2303-fix-dtr-rts-being-raised-on-baud-rate-change.patch create mode 100644 queue-3.3/usb-serial-fix-race-between-probe-and-open.patch create mode 100644 queue-3.3/usb-serial-metro-usb-fix-idproduct-for-uni-directional-mode.patch create mode 100644 queue-3.3/usb-sierra-add-support-for-sierra-wireless-mc7710.patch create mode 100644 queue-3.3/video-uvesafb-fix-oops-that-uvesafb-try-to-execute-nx-protected-page.patch create mode 100644 queue-3.3/x86-use-correct-byte-sized-register-constraint-in-__add.patch create mode 100644 queue-3.3/x86-use-correct-byte-sized-register-constraint-in.patch diff --git a/queue-3.3/ib-srpt-set-srq_type-to-ib_srqt_basic.patch b/queue-3.3/ib-srpt-set-srq_type-to-ib_srqt_basic.patch new file mode 100644 index 00000000000..df710ca076f --- /dev/null +++ b/queue-3.3/ib-srpt-set-srq_type-to-ib_srqt_basic.patch @@ -0,0 +1,36 @@ +From 6f3603367b8f7c34598fdfc1058622e0e1951e98 Mon Sep 17 00:00:00 2001 +From: Roland Dreier +Date: Thu, 12 Apr 2012 07:51:08 -0700 +Subject: IB/srpt: Set srq_type to IB_SRQT_BASIC + +From: Roland Dreier + +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 +Signed-off-by: Roland Dreier +Signed-off-by: Greg Kroah-Hartman + +--- + 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)) diff --git a/queue-3.3/nohz-fix-stale-jiffies-update-in-tick_nohz_restart.patch b/queue-3.3/nohz-fix-stale-jiffies-update-in-tick_nohz_restart.patch new file mode 100644 index 00000000000..eccdf9cdab6 --- /dev/null +++ b/queue-3.3/nohz-fix-stale-jiffies-update-in-tick_nohz_restart.patch @@ -0,0 +1,51 @@ +From 6f103929f8979d2638e58d7f7fda0beefcb8ee7e Mon Sep 17 00:00:00 2001 +From: Neal Cardwell +Date: Tue, 27 Mar 2012 15:09:37 -0400 +Subject: nohz: Fix stale jiffies update in tick_nohz_restart() + +From: Neal Cardwell + +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 +Cc: Ben Segall +Cc: Ingo Molnar +Link: http://lkml.kernel.org/r/1332875377-23014-1-git-send-email-ncardwell@google.com +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + } + } + diff --git a/queue-3.3/pch_uart-fix-msi-setting-issue.patch b/queue-3.3/pch_uart-fix-msi-setting-issue.patch new file mode 100644 index 00000000000..ab25fdaa1b4 --- /dev/null +++ b/queue-3.3/pch_uart-fix-msi-setting-issue.patch @@ -0,0 +1,41 @@ +From 867c902e07d5677e2a5b54c0435e589513abde48 Mon Sep 17 00:00:00 2001 +From: Tomoya MORINAGA +Date: Mon, 2 Apr 2012 14:36:22 +0900 +Subject: pch_uart: Fix MSI setting issue + +From: Tomoya MORINAGA + +commit 867c902e07d5677e2a5b54c0435e589513abde48 upstream. + +The following patch (MSI setting) is not enough. + +commit e463595fd9c752fa4bf06b47df93ef9ade3c7cf0 +Author: Alexander Stein +Date: Mon Jul 4 08:58:31 2011 +0200 + + pch_uart: Add MSI support + + Signed-off-by: Alexander Stein + Signed-off-by: Greg Kroah-Hartman + +To enable MSI mode, PCI bus-mastering must be enabled. +This patch enables the setting. + +cc: Alexander Stein +Signed-off-by: Tomoya MORINAGA +Signed-off-by: Greg Kroah-Hartman + +--- + 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); diff --git a/queue-3.3/perf-hists-catch-and-handle-out-of-date-hist-entry-maps.patch b/queue-3.3/perf-hists-catch-and-handle-out-of-date-hist-entry-maps.patch new file mode 100644 index 00000000000..395f50e3cb3 --- /dev/null +++ b/queue-3.3/perf-hists-catch-and-handle-out-of-date-hist-entry-maps.patch @@ -0,0 +1,56 @@ +From 63fa471dd49e9c9ce029d910d1024330d9b1b145 Mon Sep 17 00:00:00 2001 +From: David Miller +Date: Tue, 27 Mar 2012 03:14:18 -0400 +Subject: perf hists: Catch and handle out-of-date hist entry maps. + +From: David Miller + +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 +Link: http://lkml.kernel.org/r/20120327.031418.1220315351537060808.davem@davemloft.net +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman + +--- + 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; + } + diff --git a/queue-3.3/series b/queue-3.3/series index a2d74eccae4..bb8cd8e94b3 100644 --- a/queue-3.3/series +++ b/queue-3.3/series @@ -31,3 +31,19 @@ sparc64-eliminate-obsolete-__handle_softirq-function.patch 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 diff --git a/queue-3.3/usb-don-t-clear-urb-dev-in-scatter-gather-library.patch b/queue-3.3/usb-don-t-clear-urb-dev-in-scatter-gather-library.patch new file mode 100644 index 00000000000..9f5257716ea --- /dev/null +++ b/queue-3.3/usb-don-t-clear-urb-dev-in-scatter-gather-library.patch @@ -0,0 +1,83 @@ +From bcf398537630bf20b4dbe59ba855b69f404c93cf Mon Sep 17 00:00:00 2001 +From: Alan Stern +Date: Thu, 22 Mar 2012 11:00:21 -0400 +Subject: USB: don't clear urb->dev in scatter-gather library + +From: Alan Stern + +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 +Reported-and-tested-by: Illia Zaitsev +CC: Ming Lei +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + } diff --git a/queue-3.3/usb-don-t-ignore-suspend-errors-for-root-hubs.patch b/queue-3.3/usb-don-t-ignore-suspend-errors-for-root-hubs.patch new file mode 100644 index 00000000000..f222b691436 --- /dev/null +++ b/queue-3.3/usb-don-t-ignore-suspend-errors-for-root-hubs.patch @@ -0,0 +1,52 @@ +From cd4376e23a59a2adf3084cb5f4a523e6d5fd4e49 Mon Sep 17 00:00:00 2001 +From: Alan Stern +Date: Wed, 28 Mar 2012 15:56:17 -0400 +Subject: USB: don't ignore suspend errors for root hubs + +From: Alan Stern + +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 +Reported-by: Chen Peter +Tested-by: Chen Peter +Signed-off-by: Greg Kroah-Hartman + +--- + 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; + } + diff --git a/queue-3.3/usb-ftdi_sio-fix-race-condition-in-tiocmiwait-and-abort-of-tiocmiwait-when-the-device-is-removed.patch b/queue-3.3/usb-ftdi_sio-fix-race-condition-in-tiocmiwait-and-abort-of-tiocmiwait-when-the-device-is-removed.patch new file mode 100644 index 00000000000..c4f4ea3e259 --- /dev/null +++ b/queue-3.3/usb-ftdi_sio-fix-race-condition-in-tiocmiwait-and-abort-of-tiocmiwait-when-the-device-is-removed.patch @@ -0,0 +1,108 @@ +From 876ae50d94b02f3f523aa451b45ec5fb9c25d221 Mon Sep 17 00:00:00 2001 +From: Simon Arlott +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 + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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); diff --git a/queue-3.3/usb-ftdi_sio-fix-status-line-change-handling-for-tiocmiwait-and-tiocgicount.patch b/queue-3.3/usb-ftdi_sio-fix-status-line-change-handling-for-tiocmiwait-and-tiocgicount.patch new file mode 100644 index 00000000000..3b397f12ed4 --- /dev/null +++ b/queue-3.3/usb-ftdi_sio-fix-status-line-change-handling-for-tiocmiwait-and-tiocgicount.patch @@ -0,0 +1,76 @@ +From fca5430d48d53eaf103498c33fd0d1984b9f448b Mon Sep 17 00:00:00 2001 +From: Simon Arlott +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 + +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 +Cc: Uwe Bonnes +Signed-off-by: Greg Kroah-Hartman + +--- + 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; + } + diff --git a/queue-3.3/usb-option-re-add-novatelwireless_product_hspa_highspeed-to-option_id-array.patch b/queue-3.3/usb-option-re-add-novatelwireless_product_hspa_highspeed-to-option_id-array.patch new file mode 100644 index 00000000000..0de6781bd1d --- /dev/null +++ b/queue-3.3/usb-option-re-add-novatelwireless_product_hspa_highspeed-to-option_id-array.patch @@ -0,0 +1,28 @@ +From 9ac2feb22b5b821d81463bef92698ef7682a3145 Mon Sep 17 00:00:00 2001 +From: Santiago Garcia Mantinan +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 + +commit 9ac2feb22b5b821d81463bef92698ef7682a3145 upstream. + +Re-add NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED to option_id array + +Signed-off-by: Santiago Garcia Mantinan +Signed-off-by: Greg Kroah-Hartman + +--- + 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) }, diff --git a/queue-3.3/usb-pl2303-fix-dtr-rts-being-raised-on-baud-rate-change.patch b/queue-3.3/usb-pl2303-fix-dtr-rts-being-raised-on-baud-rate-change.patch new file mode 100644 index 00000000000..b11f3fe1ec9 --- /dev/null +++ b/queue-3.3/usb-pl2303-fix-dtr-rts-being-raised-on-baud-rate-change.patch @@ -0,0 +1,34 @@ +From ce5c9851855bab190c9a142761d54ba583ab094c Mon Sep 17 00:00:00 2001 +From: Johan Hovold +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 + +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 +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/queue-3.3/usb-serial-fix-race-between-probe-and-open.patch b/queue-3.3/usb-serial-fix-race-between-probe-and-open.patch new file mode 100644 index 00000000000..881eec6eda3 --- /dev/null +++ b/queue-3.3/usb-serial-fix-race-between-probe-and-open.patch @@ -0,0 +1,95 @@ +From a65a6f14dc24a90bde3f5d0073ba2364476200bf Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Tue, 20 Mar 2012 16:59:33 +0100 +Subject: USB: serial: fix race between probe and open + +From: Johan Hovold + +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: [] 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:[] 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] [] ? serial_activate+0x2e/0x70 [usbserial] +[ 199.698511] [] serial_activate+0x4b/0x70 [usbserial] +[ 199.698521] [] tty_port_open+0x7c/0xd0 +[ 199.698527] [] ? serial_set_termios+0xa0/0xa0 [usbserial] +[ 199.698534] [] serial_open+0x2f/0x70 [usbserial] +[ 199.698540] [] tty_open+0x20c/0x510 +[ 199.698546] [] chrdev_open+0xe7/0x230 +[ 199.698553] [] __dentry_open+0x1f2/0x390 +[ 199.698559] [] ? _raw_spin_unlock+0x2c/0x50 +[ 199.698565] [] nameidata_to_filp+0x66/0x80 +[ 199.698570] [] ? cdev_put+0x20/0x20 +[ 199.698576] [] do_last+0x198/0x730 +[ 199.698581] [] path_openat+0xa0/0x350 +[ 199.698587] [] do_filp_open+0x35/0x80 +[ 199.698593] [] ? _raw_spin_unlock+0x2c/0x50 +[ 199.698599] [] ? alloc_fd+0xc0/0x100 +[ 199.698605] [] ? getname_flags+0x72/0x120 +[ 199.698611] [] do_sys_open+0xf0/0x1c0 +[ 199.698617] [] ? trace_hardirqs_on_thunk+0xc/0x10 +[ 199.698623] [] sys_open+0x2e/0x40 +[ 199.698628] [] 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: [] 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 +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + 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: diff --git a/queue-3.3/usb-serial-metro-usb-fix-idproduct-for-uni-directional-mode.patch b/queue-3.3/usb-serial-metro-usb-fix-idproduct-for-uni-directional-mode.patch new file mode 100644 index 00000000000..a30ed6ee0a7 --- /dev/null +++ b/queue-3.3/usb-serial-metro-usb-fix-idproduct-for-uni-directional-mode.patch @@ -0,0 +1,41 @@ +From 3a450850e2bb0f92cacb12da90fe98eccd105468 Mon Sep 17 00:00:00 2001 +From: Aleksey Babahin +Date: Tue, 20 Mar 2012 00:46:31 +0400 +Subject: USB: serial: metro-usb: Fix idProduct for Uni-Directional mode. + +From: Aleksey Babahin + +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 +Signed-off-by: Greg Kroah-Hartman + +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. */ + }; diff --git a/queue-3.3/usb-sierra-add-support-for-sierra-wireless-mc7710.patch b/queue-3.3/usb-sierra-add-support-for-sierra-wireless-mc7710.patch new file mode 100644 index 00000000000..64f35b1b614 --- /dev/null +++ b/queue-3.3/usb-sierra-add-support-for-sierra-wireless-mc7710.patch @@ -0,0 +1,28 @@ +From c5d703dcc776cb542b41665f2b7e2ba054efb4a7 Mon Sep 17 00:00:00 2001 +From: Anton Samokhvalov +Date: Wed, 4 Apr 2012 22:26:01 +0400 +Subject: USB: sierra: add support for Sierra Wireless MC7710 + +From: Anton Samokhvalov + +commit c5d703dcc776cb542b41665f2b7e2ba054efb4a7 upstream. + +Just add new device id. 3G works fine, LTE not tested. + +Signed-off-by: Anton Samokhvalov +Signed-off-by: Greg Kroah-Hartman + +--- + 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 */ diff --git a/queue-3.3/video-uvesafb-fix-oops-that-uvesafb-try-to-execute-nx-protected-page.patch b/queue-3.3/video-uvesafb-fix-oops-that-uvesafb-try-to-execute-nx-protected-page.patch new file mode 100644 index 00000000000..815dfbfa839 --- /dev/null +++ b/queue-3.3/video-uvesafb-fix-oops-that-uvesafb-try-to-execute-nx-protected-page.patch @@ -0,0 +1,115 @@ +From b78f29ca0516266431688c5eb42d39ce42ec039a Mon Sep 17 00:00:00 2001 +From: Wang YanQing +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 + +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: [] 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:[] 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] [] ? uvesafb_pan_display+0x45/0x60 [uvesafb] +[ 81.744222] [] fb_pan_display+0x10c/0x160 +[ 81.744226] [] ? uvesafb_vbe_find_mode+0x180/0x180 [uvesafb] +[ 81.744230] [] bit_update_start+0x1d/0x50 +[ 81.744232] [] fbcon_switch+0x39e/0x550 +[ 81.744235] [] ? bit_cursor+0x4ea/0x560 +[ 81.744240] [] redraw_screen+0x12b/0x220 +[ 81.744245] [] ? tty_do_resize+0x3b/0xc0 +[ 81.744247] [] vc_do_resize+0x3d2/0x3e0 +[ 81.744250] [] vc_resize+0x14/0x20 +[ 81.744253] [] fbcon_init+0x29d/0x500 +[ 81.744255] [] ? set_inverse_trans_unicode+0xe4/0x110 +[ 81.744258] [] visual_init+0xb8/0x150 +[ 81.744261] [] bind_con_driver+0x16c/0x360 +[ 81.744264] [] ? register_con_driver+0x6e/0x190 +[ 81.744267] [] take_over_console+0x41/0x50 +[ 81.744269] [] fbcon_takeover+0x6a/0xd0 +[ 81.744272] [] fbcon_event_notify+0x758/0x790 +[ 81.744277] [] notifier_call_chain+0x42/0xb0 +[ 81.744280] [] __blocking_notifier_call_chain+0x60/0x90 +[ 81.744283] [] blocking_notifier_call_chain+0x1a/0x20 +[ 81.744285] [] fb_notifier_call_chain+0x11/0x20 +[ 81.744288] [] register_framebuffer+0x1d9/0x2b0 +[ 81.744293] [] ? ioremap_wc+0x33/0x40 +[ 81.744298] [] uvesafb_probe+0xaba/0xc40 [uvesafb] +[ 81.744302] [] platform_drv_probe+0xf/0x20 +[ 81.744306] [] driver_probe_device+0x68/0x170 +[ 81.744309] [] __device_attach+0x41/0x50 +[ 81.744313] [] bus_for_each_drv+0x48/0x70 +[ 81.744316] [] device_attach+0x83/0xa0 +[ 81.744319] [] ? __driver_attach+0x90/0x90 +[ 81.744321] [] bus_probe_device+0x6f/0x90 +[ 81.744324] [] device_add+0x5e5/0x680 +[ 81.744329] [] ? kvasprintf+0x43/0x60 +[ 81.744332] [] ? kobject_set_name_vargs+0x64/0x70 +[ 81.744335] [] ? kobject_set_name_vargs+0x64/0x70 +[ 81.744339] [] platform_device_add+0xff/0x1b0 +[ 81.744343] [] uvesafb_init+0x50/0x9b [uvesafb] +[ 81.744346] [] do_one_initcall+0x2f/0x170 +[ 81.744350] [] ? uvesafb_is_valid_mode+0x66/0x66 [uvesafb] +[ 81.744355] [] sys_init_module+0xf4/0x1410 +[ 81.744359] [] ? vfsmount_lock_local_unlock_cpu+0x30/0x30 +[ 81.744363] [] 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: [] 0xc00cd3b3 SS:ESP 0068:f57f3a00 +[ 81.744391] CR2: 00000000c00cd3b3 +[ 81.744393] ---[ end trace 18b2c87c925b54d6 ]--- + +Signed-off-by: Wang YanQing +Cc: Michal Januszewski +Cc: Alan Cox +Signed-off-by: Florian Tobias Schandinat +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/queue-3.3/x86-use-correct-byte-sized-register-constraint-in-__add.patch b/queue-3.3/x86-use-correct-byte-sized-register-constraint-in-__add.patch new file mode 100644 index 00000000000..3c5b70d6f2b --- /dev/null +++ b/queue-3.3/x86-use-correct-byte-sized-register-constraint-in-__add.patch @@ -0,0 +1,38 @@ +From 8c91c5325e107ec17e40a59a47c6517387d64eb7 Mon Sep 17 00:00:00 2001 +From: "H. Peter Anvin" +Date: Fri, 6 Apr 2012 09:30:57 -0700 +Subject: x86: Use correct byte-sized register constraint in __add() + +From: "H. Peter Anvin" + +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 +Cc: Jeremy Fitzhardinge +Cc: Leigh Scott +Cc: Thomas Reitmayr +Signed-off-by: Greg Kroah-Hartman + +--- + 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: \ diff --git a/queue-3.3/x86-use-correct-byte-sized-register-constraint-in.patch b/queue-3.3/x86-use-correct-byte-sized-register-constraint-in.patch new file mode 100644 index 00000000000..07f05693e66 --- /dev/null +++ b/queue-3.3/x86-use-correct-byte-sized-register-constraint-in.patch @@ -0,0 +1,36 @@ +From 2ca052a3710fac208eee690faefdeb8bbd4586a1 Mon Sep 17 00:00:00 2001 +From: Jeremy Fitzhardinge +Date: Mon, 2 Apr 2012 16:15:33 -0700 +Subject: x86: Use correct byte-sized register constraint in + __xchg_op() + +From: Jeremy Fitzhardinge + +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 +Link: http://lkml.kernel.org/r/4F7A3315.501@goop.org +Reported-by: Leigh Scott +Tested-by: Thomas Reitmayr +Signed-off-by: H. Peter Anvin +Signed-off-by: Greg Kroah-Hartman + +--- + 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: \ -- 2.47.3