]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Sep 2021 12:08:33 +0000 (14:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Sep 2021 12:08:33 +0000 (14:08 +0200)
added patches:
alsa-usb-audio-add-registration-quirk-for-jbl-quantum-800.patch
pci-call-max-payload-size-related-fixup-quirks-early.patch
usb-gadget-tegra-xudc-fix-the-wrong-mult-value-for-hs-isoc-or-intr.patch
usb-host-xhci-rcar-don-t-reload-firmware-after-the-completion.patch
usb-mtu3-fix-the-wrong-hs-mult-value.patch
usb-mtu3-restore-hs-function-when-set-ss-ssp.patch
usb-mtu3-use-mult-for-hs-isoc-or-intr.patch
x86-reboot-limit-dell-optiplex-990-quirk-to-early-bios-versions.patch
xhci-fix-even-more-unsafe-memory-usage-in-xhci-tracing.patch
xhci-fix-unsafe-memory-usage-in-xhci-tracing.patch

queue-5.10/alsa-usb-audio-add-registration-quirk-for-jbl-quantum-800.patch [new file with mode: 0644]
queue-5.10/pci-call-max-payload-size-related-fixup-quirks-early.patch [new file with mode: 0644]
queue-5.10/series
queue-5.10/usb-gadget-tegra-xudc-fix-the-wrong-mult-value-for-hs-isoc-or-intr.patch [new file with mode: 0644]
queue-5.10/usb-host-xhci-rcar-don-t-reload-firmware-after-the-completion.patch [new file with mode: 0644]
queue-5.10/usb-mtu3-fix-the-wrong-hs-mult-value.patch [new file with mode: 0644]
queue-5.10/usb-mtu3-restore-hs-function-when-set-ss-ssp.patch [new file with mode: 0644]
queue-5.10/usb-mtu3-use-mult-for-hs-isoc-or-intr.patch [new file with mode: 0644]
queue-5.10/x86-reboot-limit-dell-optiplex-990-quirk-to-early-bios-versions.patch [new file with mode: 0644]
queue-5.10/xhci-fix-even-more-unsafe-memory-usage-in-xhci-tracing.patch [new file with mode: 0644]
queue-5.10/xhci-fix-unsafe-memory-usage-in-xhci-tracing.patch [new file with mode: 0644]

diff --git a/queue-5.10/alsa-usb-audio-add-registration-quirk-for-jbl-quantum-800.patch b/queue-5.10/alsa-usb-audio-add-registration-quirk-for-jbl-quantum-800.patch
new file mode 100644 (file)
index 0000000..d33aaed
--- /dev/null
@@ -0,0 +1,31 @@
+From c8b177b6e3a005bd8fb0395a4bc5db3470301c28 Mon Sep 17 00:00:00 2001
+From: Alexander Tsoy <alexander@tsoy.me>
+Date: Tue, 31 Aug 2021 03:25:31 +0300
+Subject: ALSA: usb-audio: Add registration quirk for JBL Quantum 800
+
+From: Alexander Tsoy <alexander@tsoy.me>
+
+commit c8b177b6e3a005bd8fb0395a4bc5db3470301c28 upstream.
+
+Add another device ID for JBL Quantum 800. It requires the same quirk as
+other JBL Quantum devices.
+
+Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20210831002531.116957-1-alexander@tsoy.me
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/usb/quirks.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -1896,6 +1896,7 @@ static const struct registration_quirk r
+       REG_QUIRK_ENTRY(0x0951, 0x16ed, 2),     /* Kingston HyperX Cloud Alpha S */
+       REG_QUIRK_ENTRY(0x0951, 0x16ea, 2),     /* Kingston HyperX Cloud Flight S */
+       REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2),     /* JBL Quantum 600 */
++      REG_QUIRK_ENTRY(0x0ecb, 0x1f47, 2),     /* JBL Quantum 800 */
+       REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2),     /* JBL Quantum 400 */
+       REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2),     /* JBL Quantum 600 */
+       REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2),     /* JBL Quantum 800 */
diff --git a/queue-5.10/pci-call-max-payload-size-related-fixup-quirks-early.patch b/queue-5.10/pci-call-max-payload-size-related-fixup-quirks-early.patch
new file mode 100644 (file)
index 0000000..e7dc6c8
--- /dev/null
@@ -0,0 +1,49 @@
+From b8da302e2955fe4d41eb9d48199242674d77dbe0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Marek=20Beh=C3=BAn?= <kabel@kernel.org>
+Date: Thu, 24 Jun 2021 19:14:17 +0200
+Subject: PCI: Call Max Payload Size-related fixup quirks early
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek BehĂșn <kabel@kernel.org>
+
+commit b8da302e2955fe4d41eb9d48199242674d77dbe0 upstream.
+
+pci_device_add() calls HEADER fixups after pci_configure_device(), which
+configures Max Payload Size.
+
+Convert MPS-related fixups to EARLY fixups so pci_configure_mps() takes
+them into account.
+
+Fixes: 27d868b5e6cfa ("PCI: Set MPS to match upstream bridge")
+Link: https://lore.kernel.org/r/20210624171418.27194-1-kabel@kernel.org
+Signed-off-by: Marek BehĂșn <kabel@kernel.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/pci/quirks.c |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -3246,12 +3246,12 @@ static void fixup_mpss_256(struct pci_de
+ {
+       dev->pcie_mpss = 1; /* 256 bytes */
+ }
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
+-                       PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
+-                       PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
+-                       PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
++                      PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
++                      PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
++                      PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
+ /*
+  * Intel 5000 and 5100 Memory controllers have an erratum with read completion
index 6911c6a664658790cfa3b6578156cfba57285369..dd0b80257df993c64b48fe930c62d2ce84bc96f6 100644 (file)
@@ -14,3 +14,13 @@ netfilter-nftables-avoid-potential-overflows-on-32bit-arches.patch
 netfilter-nf_tables-initialize-set-before-expression-setup.patch
 netfilter-nftables-clone-set-element-expression-template.patch
 blk-mq-clearing-flush-request-reference-in-tags-rqs.patch
+alsa-usb-audio-add-registration-quirk-for-jbl-quantum-800.patch
+usb-host-xhci-rcar-don-t-reload-firmware-after-the-completion.patch
+usb-gadget-tegra-xudc-fix-the-wrong-mult-value-for-hs-isoc-or-intr.patch
+usb-mtu3-restore-hs-function-when-set-ss-ssp.patch
+usb-mtu3-use-mult-for-hs-isoc-or-intr.patch
+usb-mtu3-fix-the-wrong-hs-mult-value.patch
+xhci-fix-even-more-unsafe-memory-usage-in-xhci-tracing.patch
+xhci-fix-unsafe-memory-usage-in-xhci-tracing.patch
+x86-reboot-limit-dell-optiplex-990-quirk-to-early-bios-versions.patch
+pci-call-max-payload-size-related-fixup-quirks-early.patch
diff --git a/queue-5.10/usb-gadget-tegra-xudc-fix-the-wrong-mult-value-for-hs-isoc-or-intr.patch b/queue-5.10/usb-gadget-tegra-xudc-fix-the-wrong-mult-value-for-hs-isoc-or-intr.patch
new file mode 100644 (file)
index 0000000..d1bed47
--- /dev/null
@@ -0,0 +1,44 @@
+From eeb0cfb6b2b6b731902e68af641e30bd31be3c7b Mon Sep 17 00:00:00 2001
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Date: Fri, 13 Aug 2021 14:30:51 +0800
+Subject: usb: gadget: tegra-xudc: fix the wrong mult value for HS isoc or intr
+
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+
+commit eeb0cfb6b2b6b731902e68af641e30bd31be3c7b upstream.
+
+usb_endpoint_maxp() only returns the bit[10:0] of wMaxPacketSize
+of endpoint descriptor, not includes bit[12:11] anymore, so use
+usb_endpoint_maxp_mult() instead.
+Meanwhile no need AND 0x7ff when get maxp, remove it.
+
+Fixes: 49db427232fe ("usb: gadget: Add UDC driver for tegra XUSB device mode controller")
+Cc: stable@vger.kernel.org
+Acked-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/1628836253-7432-5-git-send-email-chunfeng.yun@mediatek.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/gadget/udc/tegra-xudc.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/gadget/udc/tegra-xudc.c
++++ b/drivers/usb/gadget/udc/tegra-xudc.c
+@@ -1610,7 +1610,7 @@ static void tegra_xudc_ep_context_setup(
+       u16 maxpacket, maxburst = 0, esit = 0;
+       u32 val;
+-      maxpacket = usb_endpoint_maxp(desc) & 0x7ff;
++      maxpacket = usb_endpoint_maxp(desc);
+       if (xudc->gadget.speed == USB_SPEED_SUPER) {
+               if (!usb_endpoint_xfer_control(desc))
+                       maxburst = comp_desc->bMaxBurst;
+@@ -1621,7 +1621,7 @@ static void tegra_xudc_ep_context_setup(
+                  (usb_endpoint_xfer_int(desc) ||
+                   usb_endpoint_xfer_isoc(desc))) {
+               if (xudc->gadget.speed == USB_SPEED_HIGH) {
+-                      maxburst = (usb_endpoint_maxp(desc) >> 11) & 0x3;
++                      maxburst = usb_endpoint_maxp_mult(desc) - 1;
+                       if (maxburst == 0x3) {
+                               dev_warn(xudc->dev,
+                                        "invalid endpoint maxburst\n");
diff --git a/queue-5.10/usb-host-xhci-rcar-don-t-reload-firmware-after-the-completion.patch b/queue-5.10/usb-host-xhci-rcar-don-t-reload-firmware-after-the-completion.patch
new file mode 100644 (file)
index 0000000..3068ce8
--- /dev/null
@@ -0,0 +1,38 @@
+From 57f3ffdc11143f56f1314972fe86fe17a0dcde85 Mon Sep 17 00:00:00 2001
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Date: Fri, 27 Aug 2021 15:32:27 +0900
+Subject: usb: host: xhci-rcar: Don't reload firmware after the completion
+
+From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+
+commit 57f3ffdc11143f56f1314972fe86fe17a0dcde85 upstream.
+
+According to the datasheet, "Upon the completion of FW Download,
+there is no need to write or reload FW.". Otherwise, it's possible
+to cause unexpected behaviors. So, adds such a condition.
+
+Fixes: 4ac8918f3a73 ("usb: host: xhci-plat: add support for the R-Car H2 and M2 xHCI controllers")
+Cc: stable@vger.kernel.org # v3.17+
+Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
+Link: https://lore.kernel.org/r/20210827063227.81990-1-yoshihiro.shimoda.uh@renesas.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci-rcar.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/drivers/usb/host/xhci-rcar.c
++++ b/drivers/usb/host/xhci-rcar.c
+@@ -134,6 +134,13 @@ static int xhci_rcar_download_firmware(s
+       const struct soc_device_attribute *attr;
+       const char *firmware_name;
++      /*
++       * According to the datasheet, "Upon the completion of FW Download,
++       * there is no need to write or reload FW".
++       */
++      if (readl(regs + RCAR_USB3_DL_CTRL) & RCAR_USB3_DL_CTRL_FW_SUCCESS)
++              return 0;
++
+       attr = soc_device_match(rcar_quirks_match);
+       if (attr)
+               quirks = (uintptr_t)attr->data;
diff --git a/queue-5.10/usb-mtu3-fix-the-wrong-hs-mult-value.patch b/queue-5.10/usb-mtu3-fix-the-wrong-hs-mult-value.patch
new file mode 100644 (file)
index 0000000..06de904
--- /dev/null
@@ -0,0 +1,49 @@
+From 44e4439d8f9f8d0e9da767d1f31e7c211081feca Mon Sep 17 00:00:00 2001
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Date: Fri, 13 Aug 2021 14:30:49 +0800
+Subject: usb: mtu3: fix the wrong HS mult value
+
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+
+commit 44e4439d8f9f8d0e9da767d1f31e7c211081feca upstream.
+
+usb_endpoint_maxp() returns actual max packet size, @mult will
+always be zero, fix it by using usb_endpoint_maxp_mult() instead
+to get mult.
+
+Fixes: 4d79e042ed8b ("usb: mtu3: add support for usb3.1 IP")
+Cc: stable@vger.kernel.org
+Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/1628836253-7432-3-git-send-email-chunfeng.yun@mediatek.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/mtu3/mtu3_gadget.c |    6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+--- a/drivers/usb/mtu3/mtu3_gadget.c
++++ b/drivers/usb/mtu3/mtu3_gadget.c
+@@ -64,14 +64,12 @@ static int mtu3_ep_enable(struct mtu3_ep
+       u32 interval = 0;
+       u32 mult = 0;
+       u32 burst = 0;
+-      int max_packet;
+       int ret;
+       desc = mep->desc;
+       comp_desc = mep->comp_desc;
+       mep->type = usb_endpoint_type(desc);
+-      max_packet = usb_endpoint_maxp(desc);
+-      mep->maxp = max_packet & GENMASK(10, 0);
++      mep->maxp = usb_endpoint_maxp(desc);
+       switch (mtu->g.speed) {
+       case USB_SPEED_SUPER:
+@@ -92,7 +90,7 @@ static int mtu3_ep_enable(struct mtu3_ep
+                               usb_endpoint_xfer_int(desc)) {
+                       interval = desc->bInterval;
+                       interval = clamp_val(interval, 1, 16) - 1;
+-                      mult = (max_packet & GENMASK(12, 11)) >> 11;
++                      mult = usb_endpoint_maxp_mult(desc) - 1;
+               }
+               break;
+       default:
diff --git a/queue-5.10/usb-mtu3-restore-hs-function-when-set-ss-ssp.patch b/queue-5.10/usb-mtu3-restore-hs-function-when-set-ss-ssp.patch
new file mode 100644 (file)
index 0000000..542d4a8
--- /dev/null
@@ -0,0 +1,38 @@
+From e88f28514065a6c48aadc367efb0ef6378a01543 Mon Sep 17 00:00:00 2001
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Date: Fri, 13 Aug 2021 14:30:47 +0800
+Subject: usb: mtu3: restore HS function when set SS/SSP
+
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+
+commit e88f28514065a6c48aadc367efb0ef6378a01543 upstream.
+
+Due to HS function is disabled when set as FS, need restore
+it when set as SS/SSP.
+
+Fixes: dc4c1aa7eae9 ("usb: mtu3: add ->udc_set_speed()")
+Cc: stable@vger.kernel.org
+Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/1628836253-7432-1-git-send-email-chunfeng.yun@mediatek.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/mtu3/mtu3_core.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/mtu3/mtu3_core.c
++++ b/drivers/usb/mtu3/mtu3_core.c
+@@ -227,11 +227,13 @@ void mtu3_set_speed(struct mtu3 *mtu, en
+               mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
+               break;
+       case USB_SPEED_SUPER:
++              mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
+               mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
+                            SSUSB_U3_PORT_SSP_SPEED);
+               break;
+       case USB_SPEED_SUPER_PLUS:
+-                      mtu3_setbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
++              mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
++              mtu3_setbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
+                            SSUSB_U3_PORT_SSP_SPEED);
+               break;
+       default:
diff --git a/queue-5.10/usb-mtu3-use-mult-for-hs-isoc-or-intr.patch b/queue-5.10/usb-mtu3-use-mult-for-hs-isoc-or-intr.patch
new file mode 100644 (file)
index 0000000..3da4f04
--- /dev/null
@@ -0,0 +1,32 @@
+From fd7cb394ec7efccc3985feb0978cee4d352e1817 Mon Sep 17 00:00:00 2001
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Date: Fri, 13 Aug 2021 14:30:48 +0800
+Subject: usb: mtu3: use @mult for HS isoc or intr
+
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+
+commit fd7cb394ec7efccc3985feb0978cee4d352e1817 upstream.
+
+For HS isoc or intr, should use @mult but not @burst
+to save mult value.
+
+Fixes: 4d79e042ed8b ("usb: mtu3: add support for usb3.1 IP")
+Cc: stable@vger.kernel.org
+Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/1628836253-7432-2-git-send-email-chunfeng.yun@mediatek.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/mtu3/mtu3_gadget.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/mtu3/mtu3_gadget.c
++++ b/drivers/usb/mtu3/mtu3_gadget.c
+@@ -92,7 +92,7 @@ static int mtu3_ep_enable(struct mtu3_ep
+                               usb_endpoint_xfer_int(desc)) {
+                       interval = desc->bInterval;
+                       interval = clamp_val(interval, 1, 16) - 1;
+-                      burst = (max_packet & GENMASK(12, 11)) >> 11;
++                      mult = (max_packet & GENMASK(12, 11)) >> 11;
+               }
+               break;
+       default:
diff --git a/queue-5.10/x86-reboot-limit-dell-optiplex-990-quirk-to-early-bios-versions.patch b/queue-5.10/x86-reboot-limit-dell-optiplex-990-quirk-to-early-bios-versions.patch
new file mode 100644 (file)
index 0000000..bfce2f7
--- /dev/null
@@ -0,0 +1,87 @@
+From a729691b541f6e63043beae72e635635abe5dc09 Mon Sep 17 00:00:00 2001
+From: Paul Gortmaker <paul.gortmaker@windriver.com>
+Date: Sun, 30 May 2021 12:24:47 -0400
+Subject: x86/reboot: Limit Dell Optiplex 990 quirk to early BIOS versions
+
+From: Paul Gortmaker <paul.gortmaker@windriver.com>
+
+commit a729691b541f6e63043beae72e635635abe5dc09 upstream.
+
+When this platform was relatively new in November 2011, with early BIOS
+revisions, a reboot quirk was added in commit 6be30bb7d750 ("x86/reboot:
+Blacklist Dell OptiPlex 990 known to require PCI reboot")
+
+However, this quirk (and several others) are open-ended to all BIOS
+versions and left no automatic expiry if/when the system BIOS fixed the
+issue, meaning that nobody is likely to come along and re-test.
+
+What is really problematic with using PCI reboot as this quirk does, is
+that it causes this platform to do a full power down, wait one second,
+and then power back on.  This is less than ideal if one is using it for
+boot testing and/or bisecting kernels when legacy rotating hard disks
+are installed.
+
+It was only by chance that the quirk was noticed in dmesg - and when
+disabled it turned out that it wasn't required anymore (BIOS A24), and a
+default reboot would work fine without the "harshness" of power cycling the
+machine (and disks) down and up like the PCI reboot does.
+
+Doing a bit more research, it seems that the "newest" BIOS for which the
+issue was reported[1] was version A06, however Dell[2] seemed to suggest
+only up to and including version A05, with the A06 having a large number of
+fixes[3] listed.
+
+As is typical with a new platform, the initial BIOS updates come frequently
+and then taper off (and in this case, with a revival for CPU CVEs); a
+search for O990-A<ver>.exe reveals the following dates:
+
+        A02     16 Mar 2011
+        A03     11 May 2011
+        A06     14 Sep 2011
+        A07     24 Oct 2011
+        A10     08 Dec 2011
+        A14     06 Sep 2012
+        A16     15 Oct 2012
+        A18     30 Sep 2013
+        A19     23 Sep 2015
+        A20     02 Jun 2017
+        A23     07 Mar 2018
+        A24     21 Aug 2018
+
+While it's overkill to flash and test each of the above, it would seem
+likely that the issue was contained within A0x BIOS versions, given the
+dates above and the dates of issue reports[4] from distros.  So rather than
+just throw out the quirk entirely, limit the scope to just those early BIOS
+versions, in case people are still running systems from 2011 with the
+original as-shipped early A0x BIOS versions.
+
+[1] https://lore.kernel.org/lkml/1320373471-3942-1-git-send-email-trenn@suse.de/
+[2] https://www.dell.com/support/kbdoc/en-ca/000131908/linux-based-operating-systems-stall-upon-reboot-on-optiplex-390-790-990-systems
+[3] https://www.dell.com/support/home/en-ca/drivers/driversdetails?driverid=85j10
+[4] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/768039
+
+Fixes: 6be30bb7d750 ("x86/reboot: Blacklist Dell OptiPlex 990 known to require PCI reboot")
+Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/20210530162447.996461-4-paul.gortmaker@windriver.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/kernel/reboot.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -388,10 +388,11 @@ static const struct dmi_system_id reboot
+       },
+       {       /* Handle problems with rebooting on the OptiPlex 990. */
+               .callback = set_pci_reboot,
+-              .ident = "Dell OptiPlex 990",
++              .ident = "Dell OptiPlex 990 BIOS A0x",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),
++                      DMI_MATCH(DMI_BIOS_VERSION, "A0"),
+               },
+       },
+       {       /* Handle problems with rebooting on Dell 300's */
diff --git a/queue-5.10/xhci-fix-even-more-unsafe-memory-usage-in-xhci-tracing.patch b/queue-5.10/xhci-fix-even-more-unsafe-memory-usage-in-xhci-tracing.patch
new file mode 100644 (file)
index 0000000..3c73495
--- /dev/null
@@ -0,0 +1,223 @@
+From 4843b4b5ec64b875a5e334f280508f1f75e7d3e4 Mon Sep 17 00:00:00 2001
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+Date: Fri, 20 Aug 2021 15:34:59 +0300
+Subject: xhci: fix even more unsafe memory usage in xhci tracing
+
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+
+commit 4843b4b5ec64b875a5e334f280508f1f75e7d3e4 upstream.
+
+Removes static char buffer usage in the following decode functions:
+       xhci_decode_ctrl_ctx()
+       xhci_decode_slot_context()
+       xhci_decode_usbsts()
+       xhci_decode_doorbell()
+       xhci_decode_ep_context()
+
+Caller must provide a buffer to use.
+In tracing use __get_str() as recommended to pass buffer.
+
+Minor changes are needed in other xhci code as these functions are also
+used elsewhere
+
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20210820123503.2605901-3-mathias.nyman@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci-debugfs.c |    8 ++++++--
+ drivers/usb/host/xhci-ring.c    |    3 ++-
+ drivers/usb/host/xhci-trace.h   |   18 +++++++++++-------
+ drivers/usb/host/xhci.h         |   21 ++++++++-------------
+ 4 files changed, 27 insertions(+), 23 deletions(-)
+
+--- a/drivers/usb/host/xhci-debugfs.c
++++ b/drivers/usb/host/xhci-debugfs.c
+@@ -260,11 +260,13 @@ static int xhci_slot_context_show(struct
+       struct xhci_slot_ctx    *slot_ctx;
+       struct xhci_slot_priv   *priv = s->private;
+       struct xhci_virt_device *dev = priv->dev;
++      char                    str[XHCI_MSG_MAX];
+       xhci = hcd_to_xhci(bus_to_hcd(dev->udev->bus));
+       slot_ctx = xhci_get_slot_ctx(xhci, dev->out_ctx);
+       seq_printf(s, "%pad: %s\n", &dev->out_ctx->dma,
+-                 xhci_decode_slot_context(le32_to_cpu(slot_ctx->dev_info),
++                 xhci_decode_slot_context(str,
++                                          le32_to_cpu(slot_ctx->dev_info),
+                                           le32_to_cpu(slot_ctx->dev_info2),
+                                           le32_to_cpu(slot_ctx->tt_info),
+                                           le32_to_cpu(slot_ctx->dev_state)));
+@@ -280,6 +282,7 @@ static int xhci_endpoint_context_show(st
+       struct xhci_ep_ctx      *ep_ctx;
+       struct xhci_slot_priv   *priv = s->private;
+       struct xhci_virt_device *dev = priv->dev;
++      char                    str[XHCI_MSG_MAX];
+       xhci = hcd_to_xhci(bus_to_hcd(dev->udev->bus));
+@@ -287,7 +290,8 @@ static int xhci_endpoint_context_show(st
+               ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index);
+               dma = dev->out_ctx->dma + (ep_index + 1) * CTX_SIZE(xhci->hcc_params);
+               seq_printf(s, "%pad: %s\n", &dma,
+-                         xhci_decode_ep_context(le32_to_cpu(ep_ctx->ep_info),
++                         xhci_decode_ep_context(str,
++                                                le32_to_cpu(ep_ctx->ep_info),
+                                                 le32_to_cpu(ep_ctx->ep_info2),
+                                                 le64_to_cpu(ep_ctx->deq),
+                                                 le32_to_cpu(ep_ctx->tx_info)));
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -1005,6 +1005,7 @@ void xhci_stop_endpoint_command_watchdog
+       struct xhci_hcd *xhci = ep->xhci;
+       unsigned long flags;
+       u32 usbsts;
++      char str[XHCI_MSG_MAX];
+       spin_lock_irqsave(&xhci->lock, flags);
+@@ -1018,7 +1019,7 @@ void xhci_stop_endpoint_command_watchdog
+       usbsts = readl(&xhci->op_regs->status);
+       xhci_warn(xhci, "xHCI host not responding to stop endpoint command.\n");
+-      xhci_warn(xhci, "USBSTS:%s\n", xhci_decode_usbsts(usbsts));
++      xhci_warn(xhci, "USBSTS:%s\n", xhci_decode_usbsts(str, usbsts));
+       ep->ep_state &= ~EP_STOP_CMD_PENDING;
+--- a/drivers/usb/host/xhci-trace.h
++++ b/drivers/usb/host/xhci-trace.h
+@@ -323,6 +323,7 @@ DECLARE_EVENT_CLASS(xhci_log_ep_ctx,
+               __field(u32, info2)
+               __field(u64, deq)
+               __field(u32, tx_info)
++              __dynamic_array(char, str, XHCI_MSG_MAX)
+       ),
+       TP_fast_assign(
+               __entry->info = le32_to_cpu(ctx->ep_info);
+@@ -330,8 +331,8 @@ DECLARE_EVENT_CLASS(xhci_log_ep_ctx,
+               __entry->deq = le64_to_cpu(ctx->deq);
+               __entry->tx_info = le32_to_cpu(ctx->tx_info);
+       ),
+-      TP_printk("%s", xhci_decode_ep_context(__entry->info,
+-              __entry->info2, __entry->deq, __entry->tx_info)
++      TP_printk("%s", xhci_decode_ep_context(__get_str(str),
++              __entry->info, __entry->info2, __entry->deq, __entry->tx_info)
+       )
+ );
+@@ -368,6 +369,7 @@ DECLARE_EVENT_CLASS(xhci_log_slot_ctx,
+               __field(u32, info2)
+               __field(u32, tt_info)
+               __field(u32, state)
++              __dynamic_array(char, str, XHCI_MSG_MAX)
+       ),
+       TP_fast_assign(
+               __entry->info = le32_to_cpu(ctx->dev_info);
+@@ -375,9 +377,9 @@ DECLARE_EVENT_CLASS(xhci_log_slot_ctx,
+               __entry->tt_info = le64_to_cpu(ctx->tt_info);
+               __entry->state = le32_to_cpu(ctx->dev_state);
+       ),
+-      TP_printk("%s", xhci_decode_slot_context(__entry->info,
+-                      __entry->info2, __entry->tt_info,
+-                      __entry->state)
++      TP_printk("%s", xhci_decode_slot_context(__get_str(str),
++                      __entry->info, __entry->info2,
++                      __entry->tt_info, __entry->state)
+       )
+ );
+@@ -432,12 +434,13 @@ DECLARE_EVENT_CLASS(xhci_log_ctrl_ctx,
+       TP_STRUCT__entry(
+               __field(u32, drop)
+               __field(u32, add)
++              __dynamic_array(char, str, XHCI_MSG_MAX)
+       ),
+       TP_fast_assign(
+               __entry->drop = le32_to_cpu(ctrl_ctx->drop_flags);
+               __entry->add = le32_to_cpu(ctrl_ctx->add_flags);
+       ),
+-      TP_printk("%s", xhci_decode_ctrl_ctx(__entry->drop, __entry->add)
++      TP_printk("%s", xhci_decode_ctrl_ctx(__get_str(str), __entry->drop, __entry->add)
+       )
+ );
+@@ -555,13 +558,14 @@ DECLARE_EVENT_CLASS(xhci_log_doorbell,
+       TP_STRUCT__entry(
+               __field(u32, slot)
+               __field(u32, doorbell)
++              __dynamic_array(char, str, XHCI_MSG_MAX)
+       ),
+       TP_fast_assign(
+               __entry->slot = slot;
+               __entry->doorbell = doorbell;
+       ),
+       TP_printk("Ring doorbell for %s",
+-              xhci_decode_doorbell(__entry->slot, __entry->doorbell)
++                xhci_decode_doorbell(__get_str(str), __entry->slot, __entry->doorbell)
+       )
+ );
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -2443,10 +2443,9 @@ static inline const char *xhci_decode_tr
+       return str;
+ }
+-static inline const char *xhci_decode_ctrl_ctx(unsigned long drop,
+-                                             unsigned long add)
++static inline const char *xhci_decode_ctrl_ctx(char *str,
++              unsigned long drop, unsigned long add)
+ {
+-      static char     str[1024];
+       unsigned int    bit;
+       int             ret = 0;
+@@ -2472,10 +2471,9 @@ static inline const char *xhci_decode_ct
+       return str;
+ }
+-static inline const char *xhci_decode_slot_context(u32 info, u32 info2,
+-              u32 tt_info, u32 state)
++static inline const char *xhci_decode_slot_context(char *str,
++              u32 info, u32 info2, u32 tt_info, u32 state)
+ {
+-      static char str[1024];
+       u32 speed;
+       u32 hub;
+       u32 mtt;
+@@ -2605,9 +2603,8 @@ static inline const char *xhci_decode_po
+       return str;
+ }
+-static inline const char *xhci_decode_usbsts(u32 usbsts)
++static inline const char *xhci_decode_usbsts(char *str, u32 usbsts)
+ {
+-      static char str[256];
+       int ret = 0;
+       if (usbsts == ~(u32)0)
+@@ -2634,9 +2631,8 @@ static inline const char *xhci_decode_us
+       return str;
+ }
+-static inline const char *xhci_decode_doorbell(u32 slot, u32 doorbell)
++static inline const char *xhci_decode_doorbell(char *str, u32 slot, u32 doorbell)
+ {
+-      static char str[256];
+       u8 ep;
+       u16 stream;
+       int ret;
+@@ -2703,10 +2699,9 @@ static inline const char *xhci_ep_type_s
+       }
+ }
+-static inline const char *xhci_decode_ep_context(u32 info, u32 info2, u64 deq,
+-              u32 tx_info)
++static inline const char *xhci_decode_ep_context(char *str, u32 info,
++              u32 info2, u64 deq, u32 tx_info)
+ {
+-      static char str[1024];
+       int ret;
+       u32 esit;
diff --git a/queue-5.10/xhci-fix-unsafe-memory-usage-in-xhci-tracing.patch b/queue-5.10/xhci-fix-unsafe-memory-usage-in-xhci-tracing.patch
new file mode 100644 (file)
index 0000000..9b45a7b
--- /dev/null
@@ -0,0 +1,307 @@
+From cbf286e8ef8337308c259ff5b9ce2e74d403be5a Mon Sep 17 00:00:00 2001
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+Date: Fri, 20 Aug 2021 15:34:58 +0300
+Subject: xhci: fix unsafe memory usage in xhci tracing
+
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+
+commit cbf286e8ef8337308c259ff5b9ce2e74d403be5a upstream.
+
+Removes static char buffer usage in the following decode functions:
+       xhci_decode_trb()
+       xhci_decode_ptortsc()
+
+Caller must provide a buffer to use.
+In tracing use __get_str() as recommended to pass buffer.
+
+Minor chanes are needed in xhci debugfs code as these functions are also
+used there. Changes include moving XHCI_MSG_MAX definititon from
+xhci-trace.h to xhci.h
+
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20210820123503.2605901-2-mathias.nyman@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci-debugfs.c |    6 +++-
+ drivers/usb/host/xhci-trace.h   |    8 +++---
+ drivers/usb/host/xhci.h         |   52 +++++++++++++++++++++-------------------
+ 3 files changed, 36 insertions(+), 30 deletions(-)
+
+--- a/drivers/usb/host/xhci-debugfs.c
++++ b/drivers/usb/host/xhci-debugfs.c
+@@ -198,12 +198,13 @@ static void xhci_ring_dump_segment(struc
+       int                     i;
+       dma_addr_t              dma;
+       union xhci_trb          *trb;
++      char                    str[XHCI_MSG_MAX];
+       for (i = 0; i < TRBS_PER_SEGMENT; i++) {
+               trb = &seg->trbs[i];
+               dma = seg->dma + i * sizeof(*trb);
+               seq_printf(s, "%pad: %s\n", &dma,
+-                         xhci_decode_trb(le32_to_cpu(trb->generic.field[0]),
++                         xhci_decode_trb(str, XHCI_MSG_MAX, le32_to_cpu(trb->generic.field[0]),
+                                          le32_to_cpu(trb->generic.field[1]),
+                                          le32_to_cpu(trb->generic.field[2]),
+                                          le32_to_cpu(trb->generic.field[3])));
+@@ -345,9 +346,10 @@ static int xhci_portsc_show(struct seq_f
+ {
+       struct xhci_port        *port = s->private;
+       u32                     portsc;
++      char                    str[XHCI_MSG_MAX];
+       portsc = readl(port->addr);
+-      seq_printf(s, "%s\n", xhci_decode_portsc(portsc));
++      seq_printf(s, "%s\n", xhci_decode_portsc(str, portsc));
+       return 0;
+ }
+--- a/drivers/usb/host/xhci-trace.h
++++ b/drivers/usb/host/xhci-trace.h
+@@ -25,8 +25,6 @@
+ #include "xhci.h"
+ #include "xhci-dbgcap.h"
+-#define XHCI_MSG_MAX  500
+-
+ DECLARE_EVENT_CLASS(xhci_log_msg,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf),
+@@ -122,6 +120,7 @@ DECLARE_EVENT_CLASS(xhci_log_trb,
+               __field(u32, field1)
+               __field(u32, field2)
+               __field(u32, field3)
++              __dynamic_array(char, str, XHCI_MSG_MAX)
+       ),
+       TP_fast_assign(
+               __entry->type = ring->type;
+@@ -131,7 +130,7 @@ DECLARE_EVENT_CLASS(xhci_log_trb,
+               __entry->field3 = le32_to_cpu(trb->field[3]);
+       ),
+       TP_printk("%s: %s", xhci_ring_type_string(__entry->type),
+-                      xhci_decode_trb(__entry->field0, __entry->field1,
++                xhci_decode_trb(__get_str(str), XHCI_MSG_MAX, __entry->field0, __entry->field1,
+                                       __entry->field2, __entry->field3)
+       )
+ );
+@@ -526,6 +525,7 @@ DECLARE_EVENT_CLASS(xhci_log_portsc,
+                   TP_STRUCT__entry(
+                                    __field(u32, portnum)
+                                    __field(u32, portsc)
++                                   __dynamic_array(char, str, XHCI_MSG_MAX)
+                                    ),
+                   TP_fast_assign(
+                                  __entry->portnum = portnum;
+@@ -533,7 +533,7 @@ DECLARE_EVENT_CLASS(xhci_log_portsc,
+                                  ),
+                   TP_printk("port-%d: %s",
+                             __entry->portnum,
+-                            xhci_decode_portsc(__entry->portsc)
++                            xhci_decode_portsc(__get_str(str), __entry->portsc)
+                             )
+ );
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -22,6 +22,9 @@
+ #include      "xhci-ext-caps.h"
+ #include "pci-quirks.h"
++/* max buffer size for trace and debug messages */
++#define XHCI_MSG_MAX          500
++
+ /* xHCI PCI Configuration Registers */
+ #define XHCI_SBRN_OFFSET      (0x60)
+@@ -2223,15 +2226,14 @@ static inline char *xhci_slot_state_stri
+       }
+ }
+-static inline const char *xhci_decode_trb(u32 field0, u32 field1, u32 field2,
+-              u32 field3)
++static inline const char *xhci_decode_trb(char *str, size_t size,
++                                        u32 field0, u32 field1, u32 field2, u32 field3)
+ {
+-      static char str[256];
+       int type = TRB_FIELD_TO_TYPE(field3);
+       switch (type) {
+       case TRB_LINK:
+-              sprintf(str,
++              snprintf(str, size,
+                       "LINK %08x%08x intr %d type '%s' flags %c:%c:%c:%c",
+                       field1, field0, GET_INTR_TARGET(field2),
+                       xhci_trb_type_string(type),
+@@ -2248,7 +2250,7 @@ static inline const char *xhci_decode_tr
+       case TRB_HC_EVENT:
+       case TRB_DEV_NOTE:
+       case TRB_MFINDEX_WRAP:
+-              sprintf(str,
++              snprintf(str, size,
+                       "TRB %08x%08x status '%s' len %d slot %d ep %d type '%s' flags %c:%c",
+                       field1, field0,
+                       xhci_trb_comp_code_string(GET_COMP_CODE(field2)),
+@@ -2261,7 +2263,8 @@ static inline const char *xhci_decode_tr
+               break;
+       case TRB_SETUP:
+-              sprintf(str, "bRequestType %02x bRequest %02x wValue %02x%02x wIndex %02x%02x wLength %d length %d TD size %d intr %d type '%s' flags %c:%c:%c",
++              snprintf(str, size,
++                      "bRequestType %02x bRequest %02x wValue %02x%02x wIndex %02x%02x wLength %d length %d TD size %d intr %d type '%s' flags %c:%c:%c",
+                               field0 & 0xff,
+                               (field0 & 0xff00) >> 8,
+                               (field0 & 0xff000000) >> 24,
+@@ -2278,7 +2281,8 @@ static inline const char *xhci_decode_tr
+                               field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_DATA:
+-              sprintf(str, "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c",
++              snprintf(str, size,
++                       "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c",
+                               field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
+                               GET_INTR_TARGET(field2),
+                               xhci_trb_type_string(type),
+@@ -2291,7 +2295,8 @@ static inline const char *xhci_decode_tr
+                               field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_STATUS:
+-              sprintf(str, "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c",
++              snprintf(str, size,
++                       "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c",
+                               field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
+                               GET_INTR_TARGET(field2),
+                               xhci_trb_type_string(type),
+@@ -2304,7 +2309,7 @@ static inline const char *xhci_decode_tr
+       case TRB_ISOC:
+       case TRB_EVENT_DATA:
+       case TRB_TR_NOOP:
+-              sprintf(str,
++              snprintf(str, size,
+                       "Buffer %08x%08x length %d TD size %d intr %d type '%s' flags %c:%c:%c:%c:%c:%c:%c:%c",
+                       field1, field0, TRB_LEN(field2), GET_TD_SIZE(field2),
+                       GET_INTR_TARGET(field2),
+@@ -2321,21 +2326,21 @@ static inline const char *xhci_decode_tr
+       case TRB_CMD_NOOP:
+       case TRB_ENABLE_SLOT:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: flags %c",
+                       xhci_trb_type_string(type),
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_DISABLE_SLOT:
+       case TRB_NEG_BANDWIDTH:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: slot %d flags %c",
+                       xhci_trb_type_string(type),
+                       TRB_TO_SLOT_ID(field3),
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_ADDR_DEV:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: ctx %08x%08x slot %d flags %c:%c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2344,7 +2349,7 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_CONFIG_EP:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: ctx %08x%08x slot %d flags %c:%c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2353,7 +2358,7 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_EVAL_CONTEXT:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: ctx %08x%08x slot %d flags %c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2361,7 +2366,7 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_RESET_EP:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: ctx %08x%08x slot %d ep %d flags %c:%c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2382,7 +2387,7 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_SET_DEQ:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: deq %08x%08x stream %d slot %d ep %d flags %c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2393,14 +2398,14 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_RESET_DEV:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: slot %d flags %c",
+                       xhci_trb_type_string(type),
+                       TRB_TO_SLOT_ID(field3),
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_FORCE_EVENT:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: event %08x%08x vf intr %d vf id %d flags %c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2409,14 +2414,14 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_SET_LT:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: belt %d flags %c",
+                       xhci_trb_type_string(type),
+                       TRB_TO_BELT(field3),
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_GET_BW:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: ctx %08x%08x slot %d speed %d flags %c",
+                       xhci_trb_type_string(type),
+                       field1, field0,
+@@ -2425,7 +2430,7 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       case TRB_FORCE_HEADER:
+-              sprintf(str,
++              snprintf(str, size,
+                       "%s: info %08x%08x%08x pkt type %d roothub port %d flags %c",
+                       xhci_trb_type_string(type),
+                       field2, field1, field0 & 0xffffffe0,
+@@ -2434,7 +2439,7 @@ static inline const char *xhci_decode_tr
+                       field3 & TRB_CYCLE ? 'C' : 'c');
+               break;
+       default:
+-              sprintf(str,
++              snprintf(str, size,
+                       "type '%s' -> raw %08x %08x %08x %08x",
+                       xhci_trb_type_string(type),
+                       field0, field1, field2, field3);
+@@ -2557,9 +2562,8 @@ static inline const char *xhci_portsc_li
+       return "Unknown";
+ }
+-static inline const char *xhci_decode_portsc(u32 portsc)
++static inline const char *xhci_decode_portsc(char *str, u32 portsc)
+ {
+-      static char str[256];
+       int ret;
+       ret = sprintf(str, "%s %s %s Link:%s PortSpeed:%d ",