]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Dec 2017 15:22:00 +0000 (16:22 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Dec 2017 15:22:00 +0000 (16:22 +0100)
added patches:
acpi-apei-erst-fix-missing-error-handling-in-erst_reader.patch
acpi-nfit-fix-health-event-notification.patch
alsa-rawmidi-avoid-racy-info-ioctl-via-ctl-device.patch
alsa-usb-audio-add-native-dsd-support-for-esoteric-d-05x.patch
alsa-usb-audio-fix-the-missing-ctl-name-suffix-at-parsing-su.patch
clk-sunxi-sun9i-mmc-implement-reset-callback-for-reset-controls.patch
crypto-mcryptd-protect-the-per-cpu-queue-with-a-lock.patch
kvm-x86-fix-load-rflags-w-o-the-fixed-bit.patch
kvm-x86-fix-rsm-when-pcid-is-non-zero.patch
libnvdimm-dax-fix-1gb-aligned-namespaces-vs-physical-misalignment.patch
libnvdimm-pfn-fix-start_pad-handling-for-aligned-namespaces.patch
mfd-cros-ec-spi-don-t-send-first-message-too-soon.patch
mfd-twl4030-audio-fix-sibling-node-lookup.patch
mfd-twl6040-fix-child-node-lookup.patch
net-mvneta-clear-interface-link-status-on-port-disable.patch
net-mvneta-eliminate-wrong-call-to-handle-rx-descriptor-error.patch
net-mvneta-use-proper-rxq_number-in-loop-on-rx-queues.patch
parisc-hide-diva-built-in-serial-aux-and-graphics-card.patch
pci-pm-force-devices-to-d0-in-pci_pm_thaw_noirq.patch
pinctrl-cherryview-mask-all-interrupts-on-intel_strago-based-systems.patch
powerpc-perf-dereference-bhrb-entries-safely.patch
spi-xilinx-detect-stall-with-unknown-commands.patch

23 files changed:
queue-4.9/acpi-apei-erst-fix-missing-error-handling-in-erst_reader.patch [new file with mode: 0644]
queue-4.9/acpi-nfit-fix-health-event-notification.patch [new file with mode: 0644]
queue-4.9/alsa-rawmidi-avoid-racy-info-ioctl-via-ctl-device.patch [new file with mode: 0644]
queue-4.9/alsa-usb-audio-add-native-dsd-support-for-esoteric-d-05x.patch [new file with mode: 0644]
queue-4.9/alsa-usb-audio-fix-the-missing-ctl-name-suffix-at-parsing-su.patch [new file with mode: 0644]
queue-4.9/clk-sunxi-sun9i-mmc-implement-reset-callback-for-reset-controls.patch [new file with mode: 0644]
queue-4.9/crypto-mcryptd-protect-the-per-cpu-queue-with-a-lock.patch [new file with mode: 0644]
queue-4.9/kvm-x86-fix-load-rflags-w-o-the-fixed-bit.patch [new file with mode: 0644]
queue-4.9/kvm-x86-fix-rsm-when-pcid-is-non-zero.patch [new file with mode: 0644]
queue-4.9/libnvdimm-dax-fix-1gb-aligned-namespaces-vs-physical-misalignment.patch [new file with mode: 0644]
queue-4.9/libnvdimm-pfn-fix-start_pad-handling-for-aligned-namespaces.patch [new file with mode: 0644]
queue-4.9/mfd-cros-ec-spi-don-t-send-first-message-too-soon.patch [new file with mode: 0644]
queue-4.9/mfd-twl4030-audio-fix-sibling-node-lookup.patch [new file with mode: 0644]
queue-4.9/mfd-twl6040-fix-child-node-lookup.patch [new file with mode: 0644]
queue-4.9/net-mvneta-clear-interface-link-status-on-port-disable.patch [new file with mode: 0644]
queue-4.9/net-mvneta-eliminate-wrong-call-to-handle-rx-descriptor-error.patch [new file with mode: 0644]
queue-4.9/net-mvneta-use-proper-rxq_number-in-loop-on-rx-queues.patch [new file with mode: 0644]
queue-4.9/parisc-hide-diva-built-in-serial-aux-and-graphics-card.patch [new file with mode: 0644]
queue-4.9/pci-pm-force-devices-to-d0-in-pci_pm_thaw_noirq.patch [new file with mode: 0644]
queue-4.9/pinctrl-cherryview-mask-all-interrupts-on-intel_strago-based-systems.patch [new file with mode: 0644]
queue-4.9/powerpc-perf-dereference-bhrb-entries-safely.patch [new file with mode: 0644]
queue-4.9/series [new file with mode: 0644]
queue-4.9/spi-xilinx-detect-stall-with-unknown-commands.patch [new file with mode: 0644]

diff --git a/queue-4.9/acpi-apei-erst-fix-missing-error-handling-in-erst_reader.patch b/queue-4.9/acpi-apei-erst-fix-missing-error-handling-in-erst_reader.patch
new file mode 100644 (file)
index 0000000..9cbabff
--- /dev/null
@@ -0,0 +1,53 @@
+From bb82e0b4a7e96494f0c1004ce50cec3d7b5fb3d1 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 14 Dec 2017 13:31:16 +0100
+Subject: ACPI: APEI / ERST: Fix missing error handling in erst_reader()
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit bb82e0b4a7e96494f0c1004ce50cec3d7b5fb3d1 upstream.
+
+The commit f6f828513290 ("pstore: pass allocated memory region back to
+caller") changed the check of the return value from erst_read() in
+erst_reader() in the following way:
+
+        if (len == -ENOENT)
+                goto skip;
+-       else if (len < 0) {
+-               rc = -1;
++       else if (len < sizeof(*rcd)) {
++               rc = -EIO;
+                goto out;
+
+This introduced another bug: since the comparison with sizeof() is
+cast to unsigned, a negative len value doesn't hit any longer.
+As a result, when an error is returned from erst_read(), the code
+falls through, and it may eventually lead to some weird thing like
+memory corruption.
+
+This patch adds the negative error value check more explicitly for
+addressing the issue.
+
+Fixes: f6f828513290 (pstore: pass allocated memory region back to caller)
+Tested-by: Jerry Tang <jtang@suse.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Acked-by: Kees Cook <keescook@chromium.org>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/acpi/apei/erst.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/acpi/apei/erst.c
++++ b/drivers/acpi/apei/erst.c
+@@ -1020,7 +1020,7 @@ skip:
+       /* The record may be cleared by others, try read next record */
+       if (len == -ENOENT)
+               goto skip;
+-      else if (len < sizeof(*rcd)) {
++      else if (len < 0 || len < sizeof(*rcd)) {
+               rc = -EIO;
+               goto out;
+       }
diff --git a/queue-4.9/acpi-nfit-fix-health-event-notification.patch b/queue-4.9/acpi-nfit-fix-health-event-notification.patch
new file mode 100644 (file)
index 0000000..73252f2
--- /dev/null
@@ -0,0 +1,60 @@
+From adf6895754e2503d994a765535fd1813f8834674 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dan.j.williams@intel.com>
+Date: Thu, 30 Nov 2017 19:42:52 -0800
+Subject: acpi, nfit: fix health event notification
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+commit adf6895754e2503d994a765535fd1813f8834674 upstream.
+
+Integration testing with a BIOS that generates injected health event
+notifications fails to communicate those events to userspace. The nfit
+driver neglects to link the ACPI DIMM device with the necessary driver
+data so acpi_nvdimm_notify() fails this lookup:
+
+        nfit_mem = dev_get_drvdata(dev);
+        if (nfit_mem && nfit_mem->flags_attr)
+                sysfs_notify_dirent(nfit_mem->flags_attr);
+
+Add the necessary linkage when installing the notification handler and
+clean it up when the nfit driver instance is torn down.
+
+Cc: Toshi Kani <toshi.kani@hpe.com>
+Cc: Vishal Verma <vishal.l.verma@intel.com>
+Fixes: ba9c8dd3c222 ("acpi, nfit: add dimm device notification support")
+Reported-by: Daniel Osawa <daniel.k.osawa@intel.com>
+Tested-by: Daniel Osawa <daniel.k.osawa@intel.com>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/acpi/nfit/core.c |    9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/drivers/acpi/nfit/core.c
++++ b/drivers/acpi/nfit/core.c
+@@ -1390,6 +1390,11 @@ static int acpi_nfit_add_dimm(struct acp
+                               dev_name(&adev_dimm->dev));
+               return -ENXIO;
+       }
++      /*
++       * Record nfit_mem for the notification path to track back to
++       * the nfit sysfs attributes for this dimm device object.
++       */
++      dev_set_drvdata(&adev_dimm->dev, nfit_mem);
+       /*
+        * Until standardization materializes we need to consider 4
+@@ -1446,9 +1451,11 @@ static void shutdown_dimm_notify(void *d
+                       sysfs_put(nfit_mem->flags_attr);
+                       nfit_mem->flags_attr = NULL;
+               }
+-              if (adev_dimm)
++              if (adev_dimm) {
+                       acpi_remove_notify_handler(adev_dimm->handle,
+                                       ACPI_DEVICE_NOTIFY, acpi_nvdimm_notify);
++                      dev_set_drvdata(&adev_dimm->dev, NULL);
++              }
+       }
+       mutex_unlock(&acpi_desc->init_mutex);
+ }
diff --git a/queue-4.9/alsa-rawmidi-avoid-racy-info-ioctl-via-ctl-device.patch b/queue-4.9/alsa-rawmidi-avoid-racy-info-ioctl-via-ctl-device.patch
new file mode 100644 (file)
index 0000000..50548c1
--- /dev/null
@@ -0,0 +1,66 @@
+From c1cfd9025cc394fd137a01159d74335c5ac978ce Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 14 Dec 2017 16:44:12 +0100
+Subject: ALSA: rawmidi: Avoid racy info ioctl via ctl device
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit c1cfd9025cc394fd137a01159d74335c5ac978ce upstream.
+
+The rawmidi also allows to obtaining the information via ioctl of ctl
+API.  It means that user can issue an ioctl to the rawmidi device even
+when it's being removed as long as the control device is present.
+Although the code has some protection via the global register_mutex,
+its range is limited to the search of the corresponding rawmidi
+object, and the mutex is already unlocked at accessing the rawmidi
+object.  This may lead to a use-after-free.
+
+For avoiding it, this patch widens the application of register_mutex
+to the whole snd_rawmidi_info_select() function.  We have another
+mutex per rawmidi object, but this operation isn't very hot path, so
+it shouldn't matter from the performance POV.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/core/rawmidi.c |   15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+--- a/sound/core/rawmidi.c
++++ b/sound/core/rawmidi.c
+@@ -579,15 +579,14 @@ static int snd_rawmidi_info_user(struct
+       return 0;
+ }
+-int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info)
++static int __snd_rawmidi_info_select(struct snd_card *card,
++                                   struct snd_rawmidi_info *info)
+ {
+       struct snd_rawmidi *rmidi;
+       struct snd_rawmidi_str *pstr;
+       struct snd_rawmidi_substream *substream;
+-      mutex_lock(&register_mutex);
+       rmidi = snd_rawmidi_search(card, info->device);
+-      mutex_unlock(&register_mutex);
+       if (!rmidi)
+               return -ENXIO;
+       if (info->stream < 0 || info->stream > 1)
+@@ -603,6 +602,16 @@ int snd_rawmidi_info_select(struct snd_c
+       }
+       return -ENXIO;
+ }
++
++int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info)
++{
++      int ret;
++
++      mutex_lock(&register_mutex);
++      ret = __snd_rawmidi_info_select(card, info);
++      mutex_unlock(&register_mutex);
++      return ret;
++}
+ EXPORT_SYMBOL(snd_rawmidi_info_select);
+ static int snd_rawmidi_info_select_user(struct snd_card *card,
diff --git a/queue-4.9/alsa-usb-audio-add-native-dsd-support-for-esoteric-d-05x.patch b/queue-4.9/alsa-usb-audio-add-native-dsd-support-for-esoteric-d-05x.patch
new file mode 100644 (file)
index 0000000..dcddb69
--- /dev/null
@@ -0,0 +1,55 @@
+From 866f7ed7d67936dcdbcddc111c8af878c918fe7c Mon Sep 17 00:00:00 2001
+From: Jussi Laako <jussi@sonarnerd.net>
+Date: Thu, 7 Dec 2017 12:58:33 +0200
+Subject: ALSA: usb-audio: Add native DSD support for Esoteric D-05X
+
+From: Jussi Laako <jussi@sonarnerd.net>
+
+commit 866f7ed7d67936dcdbcddc111c8af878c918fe7c upstream.
+
+Adds VID:PID of Esoteric D-05X to the TEAC device id's.
+Renames the is_teac_50X_dac() function to is_teac_dsd_dac() to cover
+broader device family from the same corporation sharing the same USB
+audio implementation.
+
+Signed-off-by: Jussi Laako <jussi@sonarnerd.net>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/usb/quirks.c |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -1170,10 +1170,11 @@ static bool is_marantz_denon_dac(unsigne
+ /* TEAC UD-501/UD-503/NT-503 USB DACs need a vendor cmd to switch
+  * between PCM/DOP and native DSD mode
+  */
+-static bool is_teac_50X_dac(unsigned int id)
++static bool is_teac_dsd_dac(unsigned int id)
+ {
+       switch (id) {
+       case USB_ID(0x0644, 0x8043): /* TEAC UD-501/UD-503/NT-503 */
++      case USB_ID(0x0644, 0x8044): /* Esoteric D-05X */
+               return true;
+       }
+       return false;
+@@ -1206,7 +1207,7 @@ int snd_usb_select_mode_quirk(struct snd
+                       break;
+               }
+               mdelay(20);
+-      } else if (is_teac_50X_dac(subs->stream->chip->usb_id)) {
++      } else if (is_teac_dsd_dac(subs->stream->chip->usb_id)) {
+               /* Vendor mode switch cmd is required. */
+               switch (fmt->altsetting) {
+               case 3: /* DSD mode (DSD_U32) requested */
+@@ -1376,7 +1377,7 @@ u64 snd_usb_interface_dsd_format_quirks(
+       }
+       /* TEAC devices with USB DAC functionality */
+-      if (is_teac_50X_dac(chip->usb_id)) {
++      if (is_teac_dsd_dac(chip->usb_id)) {
+               if (fp->altsetting == 3)
+                       return SNDRV_PCM_FMTBIT_DSD_U32_BE;
+       }
diff --git a/queue-4.9/alsa-usb-audio-fix-the-missing-ctl-name-suffix-at-parsing-su.patch b/queue-4.9/alsa-usb-audio-fix-the-missing-ctl-name-suffix-at-parsing-su.patch
new file mode 100644 (file)
index 0000000..2586127
--- /dev/null
@@ -0,0 +1,75 @@
+From 5a15f289ee87eaf33f13f08a4909ec99d837ec5f Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 18 Dec 2017 23:36:57 +0100
+Subject: ALSA: usb-audio: Fix the missing ctl name suffix at parsing SU
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 5a15f289ee87eaf33f13f08a4909ec99d837ec5f upstream.
+
+The commit 89b89d121ffc ("ALSA: usb-audio: Add check return value for
+usb_string()") added the check of the return value from
+snd_usb_copy_string_desc(), which is correct per se, but it introduced
+a regression.  In the original code, either the "Clock Source",
+"Playback Source" or "Capture Source" suffix is added after the
+terminal string, while the commit changed it to add the suffix only
+when get_term_name() is failing.  It ended up with an incorrect ctl
+name like "PCM" instead of "PCM Capture Source".
+
+Also, even the original code has a similar bug: when the ctl name is
+generated from snd_usb_copy_string_desc() for the given iSelector, it
+also doesn't put the suffix.
+
+This patch addresses these issues: the suffix is added always when no
+static mapping is found.  Also the patch tries to put more comments
+and cleans up the if/else block for better readability in order to
+avoid the same pitfall again.
+
+Fixes: 89b89d121ffc ("ALSA: usb-audio: Add check return value for usb_string()")
+Reported-and-tested-by: Mauro Santos <registo.mailling@gmail.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/usb/mixer.c |   27 ++++++++++++++++-----------
+ 1 file changed, 16 insertions(+), 11 deletions(-)
+
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -2167,20 +2167,25 @@ static int parse_audio_selector_unit(str
+       kctl->private_value = (unsigned long)namelist;
+       kctl->private_free = usb_mixer_selector_elem_free;
+-      nameid = uac_selector_unit_iSelector(desc);
++      /* check the static mapping table at first */
+       len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
+-      if (len)
+-              ;
+-      else if (nameid)
+-              len = snd_usb_copy_string_desc(state, nameid, kctl->id.name,
+-                                       sizeof(kctl->id.name));
+-      else
+-              len = get_term_name(state, &state->oterm,
+-                                  kctl->id.name, sizeof(kctl->id.name), 0);
+-
+       if (!len) {
+-              strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name));
++              /* no mapping ? */
++              /* if iSelector is given, use it */
++              nameid = uac_selector_unit_iSelector(desc);
++              if (nameid)
++                      len = snd_usb_copy_string_desc(state, nameid,
++                                                     kctl->id.name,
++                                                     sizeof(kctl->id.name));
++              /* ... or pick up the terminal name at next */
++              if (!len)
++                      len = get_term_name(state, &state->oterm,
++                                  kctl->id.name, sizeof(kctl->id.name), 0);
++              /* ... or use the fixed string "USB" as the last resort */
++              if (!len)
++                      strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name));
++              /* and add the proper suffix */
+               if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
+                       append_ctl_name(kctl, " Clock Source");
+               else if ((state->oterm.type & 0xff00) == 0x0100)
diff --git a/queue-4.9/clk-sunxi-sun9i-mmc-implement-reset-callback-for-reset-controls.patch b/queue-4.9/clk-sunxi-sun9i-mmc-implement-reset-callback-for-reset-controls.patch
new file mode 100644 (file)
index 0000000..2bc0705
--- /dev/null
@@ -0,0 +1,60 @@
+From 61d2f2a05765a5f57149efbd93e3e81a83cbc2c1 Mon Sep 17 00:00:00 2001
+From: Chen-Yu Tsai <wens@csie.org>
+Date: Mon, 18 Dec 2017 11:57:51 +0800
+Subject: clk: sunxi: sun9i-mmc: Implement reset callback for reset controls
+
+From: Chen-Yu Tsai <wens@csie.org>
+
+commit 61d2f2a05765a5f57149efbd93e3e81a83cbc2c1 upstream.
+
+Our MMC host driver now issues a reset, instead of just deasserting
+the reset control, since commit c34eda69ad4c ("mmc: sunxi: Reset the
+device at probe time"). The sun9i-mmc clock driver does not support
+this, and will fail, which results in MMC not probing.
+
+This patch implements the reset callback by asserting the reset control,
+then deasserting it after a small delay.
+
+Fixes: 7a6fca879f59 ("clk: sunxi: Add driver for A80 MMC config clocks/resets")
+Signed-off-by: Chen-Yu Tsai <wens@csie.org>
+Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
+Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
+Signed-off-by: Michael Turquette <mturquette@baylibre.com>
+Link: lkml.kernel.org/r/20171218035751.20661-1-wens@csie.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/clk/sunxi/clk-sun9i-mmc.c |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/drivers/clk/sunxi/clk-sun9i-mmc.c
++++ b/drivers/clk/sunxi/clk-sun9i-mmc.c
+@@ -16,6 +16,7 @@
+ #include <linux/clk.h>
+ #include <linux/clk-provider.h>
++#include <linux/delay.h>
+ #include <linux/init.h>
+ #include <linux/of.h>
+ #include <linux/of_device.h>
+@@ -83,9 +84,20 @@ static int sun9i_mmc_reset_deassert(stru
+       return 0;
+ }
++static int sun9i_mmc_reset_reset(struct reset_controller_dev *rcdev,
++                               unsigned long id)
++{
++      sun9i_mmc_reset_assert(rcdev, id);
++      udelay(10);
++      sun9i_mmc_reset_deassert(rcdev, id);
++
++      return 0;
++}
++
+ static const struct reset_control_ops sun9i_mmc_reset_ops = {
+       .assert         = sun9i_mmc_reset_assert,
+       .deassert       = sun9i_mmc_reset_deassert,
++      .reset          = sun9i_mmc_reset_reset,
+ };
+ static int sun9i_a80_mmc_config_clk_probe(struct platform_device *pdev)
diff --git a/queue-4.9/crypto-mcryptd-protect-the-per-cpu-queue-with-a-lock.patch b/queue-4.9/crypto-mcryptd-protect-the-per-cpu-queue-with-a-lock.patch
new file mode 100644 (file)
index 0000000..ccd1c45
--- /dev/null
@@ -0,0 +1,113 @@
+From 9abffc6f2efe46c3564c04312e52e07622d40e51 Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Thu, 30 Nov 2017 13:39:27 +0100
+Subject: crypto: mcryptd - protect the per-CPU queue with a lock
+
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+
+commit 9abffc6f2efe46c3564c04312e52e07622d40e51 upstream.
+
+mcryptd_enqueue_request() grabs the per-CPU queue struct and protects
+access to it with disabled preemption. Then it schedules a worker on the
+same CPU. The worker in mcryptd_queue_worker() guards access to the same
+per-CPU variable with disabled preemption.
+
+If we take CPU-hotplug into account then it is possible that between
+queue_work_on() and the actual invocation of the worker the CPU goes
+down and the worker will be scheduled on _another_ CPU. And here the
+preempt_disable() protection does not work anymore. The easiest thing is
+to add a spin_lock() to guard access to the list.
+
+Another detail: mcryptd_queue_worker() is not processing more than
+MCRYPTD_BATCH invocation in a row. If there are still items left, then
+it will invoke queue_work() to proceed with more later. *I* would
+suggest to simply drop that check because it does not use a system
+workqueue and the workqueue is already marked as "CPU_INTENSIVE". And if
+preemption is required then the scheduler should do it.
+However if queue_work() is used then the work item is marked as CPU
+unbound. That means it will try to run on the local CPU but it may run
+on another CPU as well. Especially with CONFIG_DEBUG_WQ_FORCE_RR_CPU=y.
+Again, the preempt_disable() won't work here but lock which was
+introduced will help.
+In order to keep work-item on the local CPU (and avoid RR) I changed it
+to queue_work_on().
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ crypto/mcryptd.c         |   23 ++++++++++-------------
+ include/crypto/mcryptd.h |    1 +
+ 2 files changed, 11 insertions(+), 13 deletions(-)
+
+--- a/crypto/mcryptd.c
++++ b/crypto/mcryptd.c
+@@ -80,6 +80,7 @@ static int mcryptd_init_queue(struct mcr
+               pr_debug("cpu_queue #%d %p\n", cpu, queue->cpu_queue);
+               crypto_init_queue(&cpu_queue->queue, max_cpu_qlen);
+               INIT_WORK(&cpu_queue->work, mcryptd_queue_worker);
++              spin_lock_init(&cpu_queue->q_lock);
+       }
+       return 0;
+ }
+@@ -103,15 +104,16 @@ static int mcryptd_enqueue_request(struc
+       int cpu, err;
+       struct mcryptd_cpu_queue *cpu_queue;
+-      cpu = get_cpu();
+-      cpu_queue = this_cpu_ptr(queue->cpu_queue);
+-      rctx->tag.cpu = cpu;
++      cpu_queue = raw_cpu_ptr(queue->cpu_queue);
++      spin_lock(&cpu_queue->q_lock);
++      cpu = smp_processor_id();
++      rctx->tag.cpu = smp_processor_id();
+       err = crypto_enqueue_request(&cpu_queue->queue, request);
+       pr_debug("enqueue request: cpu %d cpu_queue %p request %p\n",
+                cpu, cpu_queue, request);
++      spin_unlock(&cpu_queue->q_lock);
+       queue_work_on(cpu, kcrypto_wq, &cpu_queue->work);
+-      put_cpu();
+       return err;
+ }
+@@ -160,16 +162,11 @@ static void mcryptd_queue_worker(struct
+       cpu_queue = container_of(work, struct mcryptd_cpu_queue, work);
+       i = 0;
+       while (i < MCRYPTD_BATCH || single_task_running()) {
+-              /*
+-               * preempt_disable/enable is used to prevent
+-               * being preempted by mcryptd_enqueue_request()
+-               */
+-              local_bh_disable();
+-              preempt_disable();
++
++              spin_lock_bh(&cpu_queue->q_lock);
+               backlog = crypto_get_backlog(&cpu_queue->queue);
+               req = crypto_dequeue_request(&cpu_queue->queue);
+-              preempt_enable();
+-              local_bh_enable();
++              spin_unlock_bh(&cpu_queue->q_lock);
+               if (!req) {
+                       mcryptd_opportunistic_flush();
+@@ -184,7 +181,7 @@ static void mcryptd_queue_worker(struct
+               ++i;
+       }
+       if (cpu_queue->queue.qlen)
+-              queue_work(kcrypto_wq, &cpu_queue->work);
++              queue_work_on(smp_processor_id(), kcrypto_wq, &cpu_queue->work);
+ }
+ void mcryptd_flusher(struct work_struct *__work)
+--- a/include/crypto/mcryptd.h
++++ b/include/crypto/mcryptd.h
+@@ -26,6 +26,7 @@ static inline struct mcryptd_ahash *__mc
+ struct mcryptd_cpu_queue {
+       struct crypto_queue queue;
++      spinlock_t q_lock;
+       struct work_struct work;
+ };
diff --git a/queue-4.9/kvm-x86-fix-load-rflags-w-o-the-fixed-bit.patch b/queue-4.9/kvm-x86-fix-load-rflags-w-o-the-fixed-bit.patch
new file mode 100644 (file)
index 0000000..4274efd
--- /dev/null
@@ -0,0 +1,72 @@
+From d73235d17ba63b53dc0e1051dbc10a1f1be91b71 Mon Sep 17 00:00:00 2001
+From: Wanpeng Li <wanpeng.li@hotmail.com>
+Date: Thu, 7 Dec 2017 00:30:08 -0800
+Subject: KVM: X86: Fix load RFLAGS w/o the fixed bit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Wanpeng Li <wanpeng.li@hotmail.com>
+
+commit d73235d17ba63b53dc0e1051dbc10a1f1be91b71 upstream.
+
+ *** Guest State ***
+ CR0: actual=0x0000000000000030, shadow=0x0000000060000010, gh_mask=fffffffffffffff7
+ CR4: actual=0x0000000000002050, shadow=0x0000000000000000, gh_mask=ffffffffffffe871
+ CR3 = 0x00000000fffbc000
+ RSP = 0x0000000000000000  RIP = 0x0000000000000000
+ RFLAGS=0x00000000         DR7 = 0x0000000000000400
+        ^^^^^^^^^^
+
+The failed vmentry is triggered by the following testcase when ept=Y:
+
+    #include <unistd.h>
+    #include <sys/syscall.h>
+    #include <string.h>
+    #include <stdint.h>
+    #include <linux/kvm.h>
+    #include <fcntl.h>
+    #include <sys/ioctl.h>
+
+    long r[5];
+    int main()
+    {
+       r[2] = open("/dev/kvm", O_RDONLY);
+       r[3] = ioctl(r[2], KVM_CREATE_VM, 0);
+       r[4] = ioctl(r[3], KVM_CREATE_VCPU, 7);
+       struct kvm_regs regs = {
+               .rflags = 0,
+       };
+       ioctl(r[4], KVM_SET_REGS, &regs);
+       ioctl(r[4], KVM_RUN, 0);
+    }
+
+X86 RFLAGS bit 1 is fixed set, userspace can simply clearing bit 1
+of RFLAGS with KVM_SET_REGS ioctl which results in vmentry fails.
+This patch fixes it by oring X86_EFLAGS_FIXED during ioctl.
+
+Suggested-by: Jim Mattson <jmattson@google.com>
+Reviewed-by: David Hildenbrand <david@redhat.com>
+Reviewed-by: Quan Xu <quan.xu0@gmail.com>
+Cc: Paolo Bonzini <pbonzini@redhat.com>
+Cc: Radim Krčmář <rkrcmar@redhat.com>
+Cc: Jim Mattson <jmattson@google.com>
+Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kvm/x86.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -7132,7 +7132,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct
+ #endif
+       kvm_rip_write(vcpu, regs->rip);
+-      kvm_set_rflags(vcpu, regs->rflags);
++      kvm_set_rflags(vcpu, regs->rflags | X86_EFLAGS_FIXED);
+       vcpu->arch.exception.pending = false;
diff --git a/queue-4.9/kvm-x86-fix-rsm-when-pcid-is-non-zero.patch b/queue-4.9/kvm-x86-fix-rsm-when-pcid-is-non-zero.patch
new file mode 100644 (file)
index 0000000..b619cea
--- /dev/null
@@ -0,0 +1,114 @@
+From fae1a3e775cca8c3a9e0eb34443b310871a15a92 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Thu, 21 Dec 2017 00:49:14 +0100
+Subject: kvm: x86: fix RSM when PCID is non-zero
+
+From: Paolo Bonzini <pbonzini@redhat.com>
+
+commit fae1a3e775cca8c3a9e0eb34443b310871a15a92 upstream.
+
+rsm_load_state_64() and rsm_enter_protected_mode() load CR3, then
+CR4 & ~PCIDE, then CR0, then CR4.
+
+However, setting CR4.PCIDE fails if CR3[11:0] != 0.  It's probably easier
+in the long run to replace rsm_enter_protected_mode() with an emulator
+callback that sets all the special registers (like KVM_SET_SREGS would
+do).  For now, set the PCID field of CR3 only after CR4.PCIDE is 1.
+
+Reported-by: Laszlo Ersek <lersek@redhat.com>
+Tested-by: Laszlo Ersek <lersek@redhat.com>
+Fixes: 660a5d517aaab9187f93854425c4c63f4a09195c
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kvm/emulate.c |   32 +++++++++++++++++++++++++-------
+ 1 file changed, 25 insertions(+), 7 deletions(-)
+
+--- a/arch/x86/kvm/emulate.c
++++ b/arch/x86/kvm/emulate.c
+@@ -2395,9 +2395,21 @@ static int rsm_load_seg_64(struct x86_em
+ }
+ static int rsm_enter_protected_mode(struct x86_emulate_ctxt *ctxt,
+-                                   u64 cr0, u64 cr4)
++                                  u64 cr0, u64 cr3, u64 cr4)
+ {
+       int bad;
++      u64 pcid;
++
++      /* In order to later set CR4.PCIDE, CR3[11:0] must be zero.  */
++      pcid = 0;
++      if (cr4 & X86_CR4_PCIDE) {
++              pcid = cr3 & 0xfff;
++              cr3 &= ~0xfff;
++      }
++
++      bad = ctxt->ops->set_cr(ctxt, 3, cr3);
++      if (bad)
++              return X86EMUL_UNHANDLEABLE;
+       /*
+        * First enable PAE, long mode needs it before CR0.PG = 1 is set.
+@@ -2416,6 +2428,12 @@ static int rsm_enter_protected_mode(stru
+               bad = ctxt->ops->set_cr(ctxt, 4, cr4);
+               if (bad)
+                       return X86EMUL_UNHANDLEABLE;
++              if (pcid) {
++                      bad = ctxt->ops->set_cr(ctxt, 3, cr3 | pcid);
++                      if (bad)
++                              return X86EMUL_UNHANDLEABLE;
++              }
++
+       }
+       return X86EMUL_CONTINUE;
+@@ -2426,11 +2444,11 @@ static int rsm_load_state_32(struct x86_
+       struct desc_struct desc;
+       struct desc_ptr dt;
+       u16 selector;
+-      u32 val, cr0, cr4;
++      u32 val, cr0, cr3, cr4;
+       int i;
+       cr0 =                      GET_SMSTATE(u32, smbase, 0x7ffc);
+-      ctxt->ops->set_cr(ctxt, 3, GET_SMSTATE(u32, smbase, 0x7ff8));
++      cr3 =                      GET_SMSTATE(u32, smbase, 0x7ff8);
+       ctxt->eflags =             GET_SMSTATE(u32, smbase, 0x7ff4) | X86_EFLAGS_FIXED;
+       ctxt->_eip =               GET_SMSTATE(u32, smbase, 0x7ff0);
+@@ -2472,14 +2490,14 @@ static int rsm_load_state_32(struct x86_
+       ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smbase, 0x7ef8));
+-      return rsm_enter_protected_mode(ctxt, cr0, cr4);
++      return rsm_enter_protected_mode(ctxt, cr0, cr3, cr4);
+ }
+ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, u64 smbase)
+ {
+       struct desc_struct desc;
+       struct desc_ptr dt;
+-      u64 val, cr0, cr4;
++      u64 val, cr0, cr3, cr4;
+       u32 base3;
+       u16 selector;
+       int i, r;
+@@ -2496,7 +2514,7 @@ static int rsm_load_state_64(struct x86_
+       ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1);
+       cr0 =                       GET_SMSTATE(u64, smbase, 0x7f58);
+-      ctxt->ops->set_cr(ctxt, 3,  GET_SMSTATE(u64, smbase, 0x7f50));
++      cr3 =                       GET_SMSTATE(u64, smbase, 0x7f50);
+       cr4 =                       GET_SMSTATE(u64, smbase, 0x7f48);
+       ctxt->ops->set_smbase(ctxt, GET_SMSTATE(u32, smbase, 0x7f00));
+       val =                       GET_SMSTATE(u64, smbase, 0x7ed0);
+@@ -2524,7 +2542,7 @@ static int rsm_load_state_64(struct x86_
+       dt.address =                GET_SMSTATE(u64, smbase, 0x7e68);
+       ctxt->ops->set_gdt(ctxt, &dt);
+-      r = rsm_enter_protected_mode(ctxt, cr0, cr4);
++      r = rsm_enter_protected_mode(ctxt, cr0, cr3, cr4);
+       if (r != X86EMUL_CONTINUE)
+               return r;
diff --git a/queue-4.9/libnvdimm-dax-fix-1gb-aligned-namespaces-vs-physical-misalignment.patch b/queue-4.9/libnvdimm-dax-fix-1gb-aligned-namespaces-vs-physical-misalignment.patch
new file mode 100644 (file)
index 0000000..6378232
--- /dev/null
@@ -0,0 +1,73 @@
+From 41fce90f26333c4fa82e8e43b9ace86c4e8a0120 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dan.j.williams@intel.com>
+Date: Mon, 4 Dec 2017 14:07:43 -0800
+Subject: libnvdimm, dax: fix 1GB-aligned namespaces vs physical misalignment
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+commit 41fce90f26333c4fa82e8e43b9ace86c4e8a0120 upstream.
+
+The following namespace configuration attempt:
+
+    # ndctl create-namespace -e namespace0.0 -m devdax -a 1G -f
+    libndctl: ndctl_dax_enable: dax0.1: failed to enable
+      Error: namespace0.0: failed to enable
+
+    failed to reconfigure namespace: No such device or address
+
+...fails when the backing memory range is not physically aligned to 1G:
+
+    # cat /proc/iomem | grep Persistent
+    210000000-30fffffff : Persistent Memory (legacy)
+
+In the above example the 4G persistent memory range starts and ends on a
+256MB boundary.
+
+We handle this case correctly when needing to handle cases that violate
+section alignment (128MB) collisions against "System RAM", and we simply
+need to extend that padding/truncation for the 1GB alignment use case.
+
+Fixes: 315c562536c4 ("libnvdimm, pfn: add 'align' attribute...")
+Reported-and-tested-by: Jane Chu <jane.chu@oracle.com>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/nvdimm/pfn_devs.c |   15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+--- a/drivers/nvdimm/pfn_devs.c
++++ b/drivers/nvdimm/pfn_devs.c
+@@ -562,6 +562,12 @@ static struct vmem_altmap *__nvdimm_setu
+       return altmap;
+ }
++static u64 phys_pmem_align_down(struct nd_pfn *nd_pfn, u64 phys)
++{
++      return min_t(u64, PHYS_SECTION_ALIGN_DOWN(phys),
++                      ALIGN_DOWN(phys, nd_pfn->align));
++}
++
+ static int nd_pfn_init(struct nd_pfn *nd_pfn)
+ {
+       u32 dax_label_reserve = is_nd_dax(&nd_pfn->dev) ? SZ_128K : 0;
+@@ -617,13 +623,16 @@ static int nd_pfn_init(struct nd_pfn *nd
+       start = nsio->res.start;
+       size = PHYS_SECTION_ALIGN_UP(start + size) - start;
+       if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM,
+-                              IORES_DESC_NONE) == REGION_MIXED) {
++                              IORES_DESC_NONE) == REGION_MIXED
++                      || !IS_ALIGNED(start + resource_size(&nsio->res),
++                              nd_pfn->align)) {
+               size = resource_size(&nsio->res);
+-              end_trunc = start + size - PHYS_SECTION_ALIGN_DOWN(start + size);
++              end_trunc = start + size - phys_pmem_align_down(nd_pfn,
++                              start + size);
+       }
+       if (start_pad + end_trunc)
+-              dev_info(&nd_pfn->dev, "%s section collision, truncate %d bytes\n",
++              dev_info(&nd_pfn->dev, "%s alignment collision, truncate %d bytes\n",
+                               dev_name(&ndns->dev), start_pad + end_trunc);
+       /*
diff --git a/queue-4.9/libnvdimm-pfn-fix-start_pad-handling-for-aligned-namespaces.patch b/queue-4.9/libnvdimm-pfn-fix-start_pad-handling-for-aligned-namespaces.patch
new file mode 100644 (file)
index 0000000..6676baa
--- /dev/null
@@ -0,0 +1,56 @@
+From 19deaa217bc04e83b59b5e8c8229eb0e53ad9efc Mon Sep 17 00:00:00 2001
+From: Dan Williams <dan.j.williams@intel.com>
+Date: Tue, 19 Dec 2017 15:07:10 -0800
+Subject: libnvdimm, pfn: fix start_pad handling for aligned namespaces
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+commit 19deaa217bc04e83b59b5e8c8229eb0e53ad9efc upstream.
+
+The alignment checks at pfn driver startup fail to properly account for
+the 'start_pad' in the case where the namespace is misaligned relative
+to its internal alignment. This is typically triggered in 1G aligned
+namespace, but could theoretically trigger with small namespace
+alignments. When this triggers the kernel reports messages of the form:
+
+    dax2.1: bad offset: 0x3c000000 dax disabled align: 0x40000000
+
+Fixes: 1ee6667cd8d1 ("libnvdimm, pfn, dax: fix initialization vs autodetect...")
+Reported-by: Jane Chu <jane.chu@oracle.com>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/nvdimm/pfn_devs.c |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/nvdimm/pfn_devs.c
++++ b/drivers/nvdimm/pfn_devs.c
+@@ -352,9 +352,9 @@ struct device *nd_pfn_create(struct nd_r
+ int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig)
+ {
+       u64 checksum, offset;
+-      unsigned long align;
+       enum nd_pfn_mode mode;
+       struct nd_namespace_io *nsio;
++      unsigned long align, start_pad;
+       struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb;
+       struct nd_namespace_common *ndns = nd_pfn->ndns;
+       const u8 *parent_uuid = nd_dev_to_uuid(&ndns->dev);
+@@ -398,6 +398,7 @@ int nd_pfn_validate(struct nd_pfn *nd_pf
+       align = le32_to_cpu(pfn_sb->align);
+       offset = le64_to_cpu(pfn_sb->dataoff);
++      start_pad = le32_to_cpu(pfn_sb->start_pad);
+       if (align == 0)
+               align = 1UL << ilog2(offset);
+       mode = le32_to_cpu(pfn_sb->mode);
+@@ -456,7 +457,7 @@ int nd_pfn_validate(struct nd_pfn *nd_pf
+               return -EBUSY;
+       }
+-      if ((align && !IS_ALIGNED(offset, align))
++      if ((align && !IS_ALIGNED(nsio->res.start + offset + start_pad, align))
+                       || !IS_ALIGNED(offset, PAGE_SIZE)) {
+               dev_err(&nd_pfn->dev,
+                               "bad offset: %#llx dax disabled align: %#lx\n",
diff --git a/queue-4.9/mfd-cros-ec-spi-don-t-send-first-message-too-soon.patch b/queue-4.9/mfd-cros-ec-spi-don-t-send-first-message-too-soon.patch
new file mode 100644 (file)
index 0000000..00f441f
--- /dev/null
@@ -0,0 +1,46 @@
+From 15d8374874ded0bec37ef27f8301a6d54032c0e5 Mon Sep 17 00:00:00 2001
+From: Jon Hunter <jonathanh@nvidia.com>
+Date: Tue, 14 Nov 2017 14:43:27 +0000
+Subject: mfd: cros ec: spi: Don't send first message too soon
+
+From: Jon Hunter <jonathanh@nvidia.com>
+
+commit 15d8374874ded0bec37ef27f8301a6d54032c0e5 upstream.
+
+On the Tegra124 Nyan-Big chromebook the very first SPI message sent to
+the EC is failing.
+
+The Tegra SPI driver configures the SPI chip-selects to be active-high
+by default (and always has for many years). The EC SPI requires an
+active-low chip-select and so the Tegra chip-select is reconfigured to
+be active-low when the EC SPI driver calls spi_setup(). The problem is
+that if the first SPI message to the EC is sent too soon after
+reconfiguring the SPI chip-select, it fails.
+
+The EC SPI driver prevents back-to-back SPI messages being sent too
+soon by keeping track of the time the last transfer was sent via the
+variable 'last_transfer_ns'. To prevent the very first transfer being
+sent too soon, initialise the 'last_transfer_ns' variable after calling
+spi_setup() and before sending the first SPI message.
+
+Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
+Reviewed-by: Brian Norris <briannorris@chromium.org>
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Acked-by: Benson Leung <bleung@chromium.org>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/mfd/cros_ec_spi.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/mfd/cros_ec_spi.c
++++ b/drivers/mfd/cros_ec_spi.c
+@@ -664,6 +664,7 @@ static int cros_ec_spi_probe(struct spi_
+                          sizeof(struct ec_response_get_protocol_info);
+       ec_dev->dout_size = sizeof(struct ec_host_request);
++      ec_spi->last_transfer_ns = ktime_get_ns();
+       err = cros_ec_register(ec_dev);
+       if (err) {
diff --git a/queue-4.9/mfd-twl4030-audio-fix-sibling-node-lookup.patch b/queue-4.9/mfd-twl4030-audio-fix-sibling-node-lookup.patch
new file mode 100644 (file)
index 0000000..0058ece
--- /dev/null
@@ -0,0 +1,50 @@
+From 0a423772de2f3d7b00899987884f62f63ae00dcb Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Sat, 11 Nov 2017 16:38:43 +0100
+Subject: mfd: twl4030-audio: Fix sibling-node lookup
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 0a423772de2f3d7b00899987884f62f63ae00dcb upstream.
+
+A helper purported to look up a child node based on its name was using
+the wrong of-helper and ended up prematurely freeing the parent of-node
+while leaking any matching node.
+
+To make things worse, any matching node would not even necessarily be a
+child node as the whole device tree was searched depth-first starting at
+the parent.
+
+Fixes: 019a7e6b7b31 ("mfd: twl4030-audio: Add DT support")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/mfd/twl4030-audio.c |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+--- a/drivers/mfd/twl4030-audio.c
++++ b/drivers/mfd/twl4030-audio.c
+@@ -159,13 +159,18 @@ unsigned int twl4030_audio_get_mclk(void
+ EXPORT_SYMBOL_GPL(twl4030_audio_get_mclk);
+ static bool twl4030_audio_has_codec(struct twl4030_audio_data *pdata,
+-                            struct device_node *node)
++                            struct device_node *parent)
+ {
++      struct device_node *node;
++
+       if (pdata && pdata->codec)
+               return true;
+-      if (of_find_node_by_name(node, "codec"))
++      node = of_get_child_by_name(parent, "codec");
++      if (node) {
++              of_node_put(node);
+               return true;
++      }
+       return false;
+ }
diff --git a/queue-4.9/mfd-twl6040-fix-child-node-lookup.patch b/queue-4.9/mfd-twl6040-fix-child-node-lookup.patch
new file mode 100644 (file)
index 0000000..333232f
--- /dev/null
@@ -0,0 +1,54 @@
+From 85e9b13cbb130a3209f21bd7933933399c389ffe Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Sat, 11 Nov 2017 16:38:44 +0100
+Subject: mfd: twl6040: Fix child-node lookup
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 85e9b13cbb130a3209f21bd7933933399c389ffe upstream.
+
+Fix child-node lookup during probe, which ended up searching the whole
+device tree depth-first starting at the parent rather than just matching
+on its children.
+
+To make things worse, the parent node was prematurely freed, while the
+child node was leaked.
+
+Note that the CONFIG_OF compile guard can be removed as
+of_get_child_by_name() provides a !CONFIG_OF implementation which always
+fails.
+
+Fixes: 37e13cecaa14 ("mfd: Add support for Device Tree to twl6040")
+Fixes: ca2cad6ae38e ("mfd: Fix twl6040 build failure")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/mfd/twl6040.c |   12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/mfd/twl6040.c
++++ b/drivers/mfd/twl6040.c
+@@ -97,12 +97,16 @@ static struct reg_sequence twl6040_patch
+ };
+-static bool twl6040_has_vibra(struct device_node *node)
++static bool twl6040_has_vibra(struct device_node *parent)
+ {
+-#ifdef CONFIG_OF
+-      if (of_find_node_by_name(node, "vibra"))
++      struct device_node *node;
++
++      node = of_get_child_by_name(parent, "vibra");
++      if (node) {
++              of_node_put(node);
+               return true;
+-#endif
++      }
++
+       return false;
+ }
diff --git a/queue-4.9/net-mvneta-clear-interface-link-status-on-port-disable.patch b/queue-4.9/net-mvneta-clear-interface-link-status-on-port-disable.patch
new file mode 100644 (file)
index 0000000..ee156d8
--- /dev/null
@@ -0,0 +1,38 @@
+From 4423c18e466afdfb02a36ee8b9f901d144b3c607 Mon Sep 17 00:00:00 2001
+From: Yelena Krivosheev <yelena@marvell.com>
+Date: Tue, 19 Dec 2017 17:59:45 +0100
+Subject: net: mvneta: clear interface link status on port disable
+
+From: Yelena Krivosheev <yelena@marvell.com>
+
+commit 4423c18e466afdfb02a36ee8b9f901d144b3c607 upstream.
+
+When port connect to PHY in polling mode (with poll interval 1 sec),
+port and phy link status must be synchronize in order don't loss link
+change event.
+
+[gregory.clement@free-electrons.com: add fixes tag]
+Fixes: c5aff18204da ("net: mvneta: driver for Marvell Armada 370/XP network unit")
+Signed-off-by: Yelena Krivosheev <yelena@marvell.com>
+Tested-by: Dmitri Epshtein <dima@marvell.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/marvell/mvneta.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -1182,6 +1182,10 @@ static void mvneta_port_disable(struct m
+       val &= ~MVNETA_GMAC0_PORT_ENABLE;
+       mvreg_write(pp, MVNETA_GMAC_CTRL_0, val);
++      pp->link = 0;
++      pp->duplex = -1;
++      pp->speed = 0;
++
+       udelay(200);
+ }
diff --git a/queue-4.9/net-mvneta-eliminate-wrong-call-to-handle-rx-descriptor-error.patch b/queue-4.9/net-mvneta-eliminate-wrong-call-to-handle-rx-descriptor-error.patch
new file mode 100644 (file)
index 0000000..a9886c5
--- /dev/null
@@ -0,0 +1,38 @@
+From 2eecb2e04abb62ef8ea7b43e1a46bdb5b99d1bf8 Mon Sep 17 00:00:00 2001
+From: Yelena Krivosheev <yelena@marvell.com>
+Date: Tue, 19 Dec 2017 17:59:47 +0100
+Subject: net: mvneta: eliminate wrong call to handle rx descriptor error
+
+From: Yelena Krivosheev <yelena@marvell.com>
+
+commit 2eecb2e04abb62ef8ea7b43e1a46bdb5b99d1bf8 upstream.
+
+There are few reasons in mvneta_rx_swbm() function when received packet
+is dropped. mvneta_rx_error() should be called only if error bit [16]
+is set in rx descriptor.
+
+[gregory.clement@free-electrons.com: add fixes tag]
+Fixes: dc35a10f68d3 ("net: mvneta: bm: add support for hardware buffer management")
+Signed-off-by: Yelena Krivosheev <yelena@marvell.com>
+Tested-by: Dmitri Epshtein <dima@marvell.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/marvell/mvneta.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -1909,9 +1909,9 @@ static int mvneta_rx_swbm(struct mvneta_
+               if (!mvneta_rxq_desc_is_first_last(rx_status) ||
+                   (rx_status & MVNETA_RXD_ERR_SUMMARY)) {
++                      mvneta_rx_error(pp, rx_desc);
+ err_drop_frame:
+                       dev->stats.rx_errors++;
+-                      mvneta_rx_error(pp, rx_desc);
+                       /* leave the descriptor untouched */
+                       continue;
+               }
diff --git a/queue-4.9/net-mvneta-use-proper-rxq_number-in-loop-on-rx-queues.patch b/queue-4.9/net-mvneta-use-proper-rxq_number-in-loop-on-rx-queues.patch
new file mode 100644 (file)
index 0000000..6370dba
--- /dev/null
@@ -0,0 +1,35 @@
+From ca5902a6547f662419689ca28b3c29a772446caa Mon Sep 17 00:00:00 2001
+From: Yelena Krivosheev <yelena@marvell.com>
+Date: Tue, 19 Dec 2017 17:59:46 +0100
+Subject: net: mvneta: use proper rxq_number in loop on rx queues
+
+From: Yelena Krivosheev <yelena@marvell.com>
+
+commit ca5902a6547f662419689ca28b3c29a772446caa upstream.
+
+When adding the RX queue association with each CPU, a typo was made in
+the mvneta_cleanup_rxqs() function. This patch fixes it.
+
+[gregory.clement@free-electrons.com: add commit log and fixes tag]
+Fixes: 2dcf75e2793c ("net: mvneta: Associate RX queues with each CPU")
+Signed-off-by: Yelena Krivosheev <yelena@marvell.com>
+Tested-by: Dmitri Epshtein <dima@marvell.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/marvell/mvneta.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -2926,7 +2926,7 @@ static void mvneta_cleanup_rxqs(struct m
+ {
+       int queue;
+-      for (queue = 0; queue < txq_number; queue++)
++      for (queue = 0; queue < rxq_number; queue++)
+               mvneta_rxq_deinit(pp, &pp->rxqs[queue]);
+ }
diff --git a/queue-4.9/parisc-hide-diva-built-in-serial-aux-and-graphics-card.patch b/queue-4.9/parisc-hide-diva-built-in-serial-aux-and-graphics-card.patch
new file mode 100644 (file)
index 0000000..36d7165
--- /dev/null
@@ -0,0 +1,60 @@
+From bcf3f1752a622f1372d3252d0fea8855d89812e7 Mon Sep 17 00:00:00 2001
+From: Helge Deller <deller@gmx.de>
+Date: Tue, 12 Dec 2017 21:52:26 +0100
+Subject: parisc: Hide Diva-built-in serial aux and graphics card
+
+From: Helge Deller <deller@gmx.de>
+
+commit bcf3f1752a622f1372d3252d0fea8855d89812e7 upstream.
+
+Diva GSP card has built-in serial AUX port and ATI graphic card which simply
+don't work and which both don't have external connectors.  User Guides even
+mention that those devices shouldn't be used.
+So, prevent that Linux drivers try to enable those devices.
+
+Signed-off-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/parisc/lba_pci.c |   33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+--- a/drivers/parisc/lba_pci.c
++++ b/drivers/parisc/lba_pci.c
+@@ -1656,3 +1656,36 @@ void lba_set_iregs(struct parisc_device
+       iounmap(base_addr);
+ }
++
++/*
++ * The design of the Diva management card in rp34x0 machines (rp3410, rp3440)
++ * seems rushed, so that many built-in components simply don't work.
++ * The following quirks disable the serial AUX port and the built-in ATI RV100
++ * Radeon 7000 graphics card which both don't have any external connectors and
++ * thus are useless, and even worse, e.g. the AUX port occupies ttyS0 and as
++ * such makes those machines the only PARISC machines on which we can't use
++ * ttyS0 as boot console.
++ */
++static void quirk_diva_ati_card(struct pci_dev *dev)
++{
++      if (dev->subsystem_vendor != PCI_VENDOR_ID_HP ||
++          dev->subsystem_device != 0x1292)
++              return;
++
++      dev_info(&dev->dev, "Hiding Diva built-in ATI card");
++      dev->device = 0;
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_QY,
++      quirk_diva_ati_card);
++
++static void quirk_diva_aux_disable(struct pci_dev *dev)
++{
++      if (dev->subsystem_vendor != PCI_VENDOR_ID_HP ||
++          dev->subsystem_device != 0x1291)
++              return;
++
++      dev_info(&dev->dev, "Hiding Diva built-in AUX serial device");
++      dev->device = 0;
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX,
++      quirk_diva_aux_disable);
diff --git a/queue-4.9/pci-pm-force-devices-to-d0-in-pci_pm_thaw_noirq.patch b/queue-4.9/pci-pm-force-devices-to-d0-in-pci_pm_thaw_noirq.patch
new file mode 100644 (file)
index 0000000..6b16757
--- /dev/null
@@ -0,0 +1,47 @@
+From 5839ee7389e893a31e4e3c9cf17b50d14103c902 Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Fri, 15 Dec 2017 03:07:18 +0100
+Subject: PCI / PM: Force devices to D0 in pci_pm_thaw_noirq()
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+commit 5839ee7389e893a31e4e3c9cf17b50d14103c902 upstream.
+
+It is incorrect to call pci_restore_state() for devices in low-power
+states (D1-D3), as that involves the restoration of MSI setup which
+requires MMIO to be operational and that is only the case in D0.
+
+However, pci_pm_thaw_noirq() may do that if the driver's "freeze"
+callbacks put the device into a low-power state, so fix it by making
+it force devices into D0 via pci_set_power_state() instead of trying
+to "update" their power state which is pointless.
+
+Fixes: e60514bd4485 (PCI/PM: Restore the status of PCI devices across hibernation)
+Reported-by: Thomas Gleixner <tglx@linutronix.de>
+Reported-by: Maarten Lankhorst <dev@mblankhorst.nl>
+Tested-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Maarten Lankhorst <dev@mblankhorst.nl>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Acked-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/pci/pci-driver.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/pci/pci-driver.c
++++ b/drivers/pci/pci-driver.c
+@@ -953,7 +953,12 @@ static int pci_pm_thaw_noirq(struct devi
+       if (pci_has_legacy_pm_support(pci_dev))
+               return pci_legacy_resume_early(dev);
+-      pci_update_current_state(pci_dev, PCI_D0);
++      /*
++       * pci_restore_state() requires the device to be in D0 (because of MSI
++       * restoration among other things), so force it into D0 in case the
++       * driver's "freeze" callbacks put it into a low-power state directly.
++       */
++      pci_set_power_state(pci_dev, PCI_D0);
+       pci_restore_state(pci_dev);
+       if (drv && drv->pm && drv->pm->thaw_noirq)
diff --git a/queue-4.9/pinctrl-cherryview-mask-all-interrupts-on-intel_strago-based-systems.patch b/queue-4.9/pinctrl-cherryview-mask-all-interrupts-on-intel_strago-based-systems.patch
new file mode 100644 (file)
index 0000000..b1c03f4
--- /dev/null
@@ -0,0 +1,52 @@
+From d2b3c353595a855794f8b9df5b5bdbe8deb0c413 Mon Sep 17 00:00:00 2001
+From: Mika Westerberg <mika.westerberg@linux.intel.com>
+Date: Mon, 4 Dec 2017 12:11:02 +0300
+Subject: pinctrl: cherryview: Mask all interrupts on Intel_Strago based systems
+
+From: Mika Westerberg <mika.westerberg@linux.intel.com>
+
+commit d2b3c353595a855794f8b9df5b5bdbe8deb0c413 upstream.
+
+Guenter Roeck reported an interrupt storm on a prototype system which is
+based on Cyan Chromebook. The root cause turned out to be a incorrectly
+configured pin that triggers spurious interrupts. This will be fixed in
+coreboot but currently we need to prevent the interrupt storm from
+happening by masking all interrupts (but not GPEs) on those systems.
+
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=197953
+Fixes: bcb48cca23ec ("pinctrl: cherryview: Do not mask all interrupts in probe")
+Reported-and-tested-by: Guenter Roeck <linux@roeck-us.net>
+Reported-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/pinctrl/intel/pinctrl-cherryview.c |   16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+--- a/drivers/pinctrl/intel/pinctrl-cherryview.c
++++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
+@@ -1594,6 +1594,22 @@ static int chv_gpio_probe(struct chv_pin
+                       clear_bit(i, chip->irq_valid_mask);
+       }
++      /*
++       * The same set of machines in chv_no_valid_mask[] have incorrectly
++       * configured GPIOs that generate spurious interrupts so we use
++       * this same list to apply another quirk for them.
++       *
++       * See also https://bugzilla.kernel.org/show_bug.cgi?id=197953.
++       */
++      if (!need_valid_mask) {
++              /*
++               * Mask all interrupts the community is able to generate
++               * but leave the ones that can only generate GPEs unmasked.
++               */
++              chv_writel(GENMASK(31, pctrl->community->nirqs),
++                         pctrl->regs + CHV_INTMASK);
++      }
++
+       /* Clear all interrupts */
+       chv_writel(0xffff, pctrl->regs + CHV_INTSTAT);
diff --git a/queue-4.9/powerpc-perf-dereference-bhrb-entries-safely.patch b/queue-4.9/powerpc-perf-dereference-bhrb-entries-safely.patch
new file mode 100644 (file)
index 0000000..48c9ffa
--- /dev/null
@@ -0,0 +1,55 @@
+From f41d84dddc66b164ac16acf3f584c276146f1c48 Mon Sep 17 00:00:00 2001
+From: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
+Date: Tue, 12 Dec 2017 17:59:15 +0530
+Subject: powerpc/perf: Dereference BHRB entries safely
+
+From: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
+
+commit f41d84dddc66b164ac16acf3f584c276146f1c48 upstream.
+
+It's theoretically possible that branch instructions recorded in
+BHRB (Branch History Rolling Buffer) entries have already been
+unmapped before they are processed by the kernel. Hence, trying to
+dereference such memory location will result in a crash. eg:
+
+    Unable to handle kernel paging request for data at address 0xd000000019c41764
+    Faulting instruction address: 0xc000000000084a14
+    NIP [c000000000084a14] branch_target+0x4/0x70
+    LR [c0000000000eb828] record_and_restart+0x568/0x5c0
+    Call Trace:
+    [c0000000000eb3b4] record_and_restart+0xf4/0x5c0 (unreliable)
+    [c0000000000ec378] perf_event_interrupt+0x298/0x460
+    [c000000000027964] performance_monitor_exception+0x54/0x70
+    [c000000000009ba4] performance_monitor_common+0x114/0x120
+
+Fix it by deferefencing the addresses safely.
+
+Fixes: 691231846ceb ("powerpc/perf: Fix setting of "to" addresses for BHRB")
+Suggested-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
+Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
+Reviewed-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
+[mpe: Use probe_kernel_read() which is clearer, tweak change log]
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/powerpc/perf/core-book3s.c |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/arch/powerpc/perf/core-book3s.c
++++ b/arch/powerpc/perf/core-book3s.c
+@@ -401,8 +401,12 @@ static __u64 power_pmu_bhrb_to(u64 addr)
+       int ret;
+       __u64 target;
+-      if (is_kernel_addr(addr))
+-              return branch_target((unsigned int *)addr);
++      if (is_kernel_addr(addr)) {
++              if (probe_kernel_read(&instr, (void *)addr, sizeof(instr)))
++                      return 0;
++
++              return branch_target(&instr);
++      }
+       /* Userspace: need copy instruction here then translate it */
+       pagefault_disable();
diff --git a/queue-4.9/series b/queue-4.9/series
new file mode 100644 (file)
index 0000000..0b0d772
--- /dev/null
@@ -0,0 +1,22 @@
+acpi-apei-erst-fix-missing-error-handling-in-erst_reader.patch
+acpi-nfit-fix-health-event-notification.patch
+crypto-mcryptd-protect-the-per-cpu-queue-with-a-lock.patch
+mfd-cros-ec-spi-don-t-send-first-message-too-soon.patch
+mfd-twl4030-audio-fix-sibling-node-lookup.patch
+mfd-twl6040-fix-child-node-lookup.patch
+alsa-rawmidi-avoid-racy-info-ioctl-via-ctl-device.patch
+alsa-usb-audio-add-native-dsd-support-for-esoteric-d-05x.patch
+alsa-usb-audio-fix-the-missing-ctl-name-suffix-at-parsing-su.patch
+pci-pm-force-devices-to-d0-in-pci_pm_thaw_noirq.patch
+parisc-hide-diva-built-in-serial-aux-and-graphics-card.patch
+spi-xilinx-detect-stall-with-unknown-commands.patch
+pinctrl-cherryview-mask-all-interrupts-on-intel_strago-based-systems.patch
+kvm-x86-fix-load-rflags-w-o-the-fixed-bit.patch
+kvm-x86-fix-rsm-when-pcid-is-non-zero.patch
+clk-sunxi-sun9i-mmc-implement-reset-callback-for-reset-controls.patch
+powerpc-perf-dereference-bhrb-entries-safely.patch
+libnvdimm-dax-fix-1gb-aligned-namespaces-vs-physical-misalignment.patch
+libnvdimm-pfn-fix-start_pad-handling-for-aligned-namespaces.patch
+net-mvneta-clear-interface-link-status-on-port-disable.patch
+net-mvneta-use-proper-rxq_number-in-loop-on-rx-queues.patch
+net-mvneta-eliminate-wrong-call-to-handle-rx-descriptor-error.patch
diff --git a/queue-4.9/spi-xilinx-detect-stall-with-unknown-commands.patch b/queue-4.9/spi-xilinx-detect-stall-with-unknown-commands.patch
new file mode 100644 (file)
index 0000000..7df478f
--- /dev/null
@@ -0,0 +1,66 @@
+From 5a1314fa697fc65cefaba64cd4699bfc3e6882a6 Mon Sep 17 00:00:00 2001
+From: Ricardo Ribalda <ricardo.ribalda@gmail.com>
+Date: Tue, 21 Nov 2017 10:09:02 +0100
+Subject: spi: xilinx: Detect stall with Unknown commands
+
+From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
+
+commit 5a1314fa697fc65cefaba64cd4699bfc3e6882a6 upstream.
+
+When the core is configured in C_SPI_MODE > 0, it integrates a
+lookup table that automatically configures the core in dual or quad mode
+based on the command (first byte on the tx fifo).
+
+Unfortunately, that list mode_?_memoy_*.mif does not contain all the
+supported commands by the flash.
+
+Since 4.14 spi-nor automatically tries to probe the flash using SFDP
+(command 0x5a), and that command is not part of the list_mode table.
+
+Whit the right combination of C_SPI_MODE and C_SPI_MEMORY this leads
+into a stall that can only be recovered with a soft rest.
+
+This patch detects this kind of stall and returns -EIO to the caller on
+those commands. spi-nor can handle this error properly:
+
+m25p80 spi0.0: Detected stall. Check C_SPI_MODE and C_SPI_MEMORY. 0x21 0x2404
+m25p80 spi0.0: SPI transfer failed: -5
+spi_master spi0: failed to transfer one message from queue
+m25p80 spi0.0: s25sl064p (8192 Kbytes)
+
+Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/spi/spi-xilinx.c |   11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/drivers/spi/spi-xilinx.c
++++ b/drivers/spi/spi-xilinx.c
+@@ -271,6 +271,7 @@ static int xilinx_spi_txrx_bufs(struct s
+       while (remaining_words) {
+               int n_words, tx_words, rx_words;
+               u32 sr;
++              int stalled;
+               n_words = min(remaining_words, xspi->buffer_size);
+@@ -299,7 +300,17 @@ static int xilinx_spi_txrx_bufs(struct s
+               /* Read out all the data from the Rx FIFO */
+               rx_words = n_words;
++              stalled = 10;
+               while (rx_words) {
++                      if (rx_words == n_words && !(stalled--) &&
++                          !(sr & XSPI_SR_TX_EMPTY_MASK) &&
++                          (sr & XSPI_SR_RX_EMPTY_MASK)) {
++                              dev_err(&spi->dev,
++                                      "Detected stall. Check C_SPI_MODE and C_SPI_MEMORY\n");
++                              xspi_init_hw(xspi);
++                              return -EIO;
++                      }
++
+                       if ((sr & XSPI_SR_TX_EMPTY_MASK) && (rx_words > 1)) {
+                               xilinx_spi_rx(xspi);
+                               rx_words--;