]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Dec 2022 09:09:13 +0000 (10:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Dec 2022 09:09:13 +0000 (10:09 +0100)
added patches:
alsa-hda-hdmi-add-hp-device-0x8711-to-force-connect-list.patch
alsa-hda-realtek-add-quirk-for-lenovo-tianyi510pro-14iob.patch
alsa-usb-audio-add-the-quirk-for-kt0206-device.patch
alsa-usb-audio-workaround-for-xrun-at-prepare.patch
arm64-dts-qcom-sm6350-fix-usb-dp-phy-registers.patch
arm64-dts-qcom-sm8250-fix-usb-dp-phy-registers.patch
clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-clk.patch
dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clock.patch
hid-logitech-hidpp-guard-ff-init-code-against-non-usb-devices.patch
usb-cdnsp-fix-lack-of-zlp-for-ep0.patch
usb-dwc3-core-defer-probe-on-ulpi_read_id-timeout.patch
usb-dwc3-fix-race-between-dwc3_set_mode-and-__dwc3_set_mode.patch
usb-dwc3-qcom-fix-memory-leak-in-dwc3_qcom_interconnect_init.patch
usb-xhci-mtk-fix-leakage-of-shared-hcd-when-fail-to-set-wakeup-irq.patch
xhci-prevent-infinite-loop-in-transaction-errors-recovery-for-streams.patch

16 files changed:
queue-6.1/alsa-hda-hdmi-add-hp-device-0x8711-to-force-connect-list.patch [new file with mode: 0644]
queue-6.1/alsa-hda-realtek-add-quirk-for-lenovo-tianyi510pro-14iob.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-add-the-quirk-for-kt0206-device.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-workaround-for-xrun-at-prepare.patch [new file with mode: 0644]
queue-6.1/arm64-dts-qcom-sm6350-fix-usb-dp-phy-registers.patch [new file with mode: 0644]
queue-6.1/arm64-dts-qcom-sm8250-fix-usb-dp-phy-registers.patch [new file with mode: 0644]
queue-6.1/clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-clk.patch [new file with mode: 0644]
queue-6.1/dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clock.patch [new file with mode: 0644]
queue-6.1/hid-logitech-hidpp-guard-ff-init-code-against-non-usb-devices.patch [new file with mode: 0644]
queue-6.1/series
queue-6.1/usb-cdnsp-fix-lack-of-zlp-for-ep0.patch [new file with mode: 0644]
queue-6.1/usb-dwc3-core-defer-probe-on-ulpi_read_id-timeout.patch [new file with mode: 0644]
queue-6.1/usb-dwc3-fix-race-between-dwc3_set_mode-and-__dwc3_set_mode.patch [new file with mode: 0644]
queue-6.1/usb-dwc3-qcom-fix-memory-leak-in-dwc3_qcom_interconnect_init.patch [new file with mode: 0644]
queue-6.1/usb-xhci-mtk-fix-leakage-of-shared-hcd-when-fail-to-set-wakeup-irq.patch [new file with mode: 0644]
queue-6.1/xhci-prevent-infinite-loop-in-transaction-errors-recovery-for-streams.patch [new file with mode: 0644]

diff --git a/queue-6.1/alsa-hda-hdmi-add-hp-device-0x8711-to-force-connect-list.patch b/queue-6.1/alsa-hda-hdmi-add-hp-device-0x8711-to-force-connect-list.patch
new file mode 100644 (file)
index 0000000..5b0b1ff
--- /dev/null
@@ -0,0 +1,32 @@
+From 31b573946ea55e1ea0e08ae8e83bcf879b30f83a Mon Sep 17 00:00:00 2001
+From: Jiao Zhou <jiaozhou@google.com>
+Date: Tue, 6 Dec 2022 13:53:11 -0500
+Subject: ALSA: hda/hdmi: Add HP Device 0x8711 to force connect list
+
+From: Jiao Zhou <jiaozhou@google.com>
+
+commit 31b573946ea55e1ea0e08ae8e83bcf879b30f83a upstream.
+
+HDMI audio is not working on the HP EliteDesk 800 G6 because the pin is
+unconnected. This issue can be resolved by using the 'hdajackretask'
+tool to override the unconnected pin to force it to connect.
+
+Signed-off-by: Jiao Zhou <jiaozhou@google.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20221206185311.3669950-1-jiaozhou@google.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/patch_hdmi.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_hdmi.c
++++ b/sound/pci/hda/patch_hdmi.c
+@@ -1976,6 +1976,7 @@ static int hdmi_add_cvt(struct hda_codec
+ static const struct snd_pci_quirk force_connect_list[] = {
+       SND_PCI_QUIRK(0x103c, 0x870f, "HP", 1),
+       SND_PCI_QUIRK(0x103c, 0x871a, "HP", 1),
++      SND_PCI_QUIRK(0x103c, 0x8711, "HP", 1),
+       SND_PCI_QUIRK(0x1462, 0xec94, "MS-7C94", 1),
+       SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", 1),
+       {}
diff --git a/queue-6.1/alsa-hda-realtek-add-quirk-for-lenovo-tianyi510pro-14iob.patch b/queue-6.1/alsa-hda-realtek-add-quirk-for-lenovo-tianyi510pro-14iob.patch
new file mode 100644 (file)
index 0000000..66c5453
--- /dev/null
@@ -0,0 +1,79 @@
+From 4bf5bf54476dffe60e6b6d8d539f67309ff599e2 Mon Sep 17 00:00:00 2001
+From: Edward Pacman <edward@edward-p.xyz>
+Date: Wed, 7 Dec 2022 21:32:18 +0800
+Subject: ALSA: hda/realtek: Add quirk for Lenovo TianYi510Pro-14IOB
+
+From: Edward Pacman <edward@edward-p.xyz>
+
+commit 4bf5bf54476dffe60e6b6d8d539f67309ff599e2 upstream.
+
+Lenovo TianYi510Pro-14IOB (17aa:3742)
+require quirk for enabling headset-mic
+
+Signed-off-by: Edward Pacman <edward@edward-p.xyz>
+Cc: <stable@vger.kernel.org>
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=216756
+Link: https://lore.kernel.org/r/20221207133218.18989-1-edward@edward-p.xyz
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/patch_realtek.c |   27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -10962,6 +10962,17 @@ static void alc897_fixup_lenovo_headset_
+       }
+ }
++static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
++                                   const struct hda_fixup *fix, int action)
++{
++      struct alc_spec *spec = codec->spec;
++
++      if (action == HDA_FIXUP_ACT_PRE_PROBE) {
++              spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
++              spec->gen.hp_automute_hook = alc897_hp_automute_hook;
++      }
++}
++
+ static const struct coef_fw alc668_coefs[] = {
+       WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
+       WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
+@@ -11045,6 +11056,8 @@ enum {
+       ALC897_FIXUP_LENOVO_HEADSET_MIC,
+       ALC897_FIXUP_HEADSET_MIC_PIN,
+       ALC897_FIXUP_HP_HSMIC_VERB,
++      ALC897_FIXUP_LENOVO_HEADSET_MODE,
++      ALC897_FIXUP_HEADSET_MIC_PIN2,
+ };
+ static const struct hda_fixup alc662_fixups[] = {
+@@ -11471,6 +11484,19 @@ static const struct hda_fixup alc662_fix
+                       { }
+               },
+       },
++      [ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
++              .type = HDA_FIXUP_FUNC,
++              .v.func = alc897_fixup_lenovo_headset_mode,
++      },
++      [ALC897_FIXUP_HEADSET_MIC_PIN2] = {
++              .type = HDA_FIXUP_PINS,
++              .v.pins = (const struct hda_pintbl[]) {
++                      { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
++                      { }
++              },
++              .chained = true,
++              .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
++      },
+ };
+ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
+@@ -11523,6 +11549,7 @@ static const struct snd_pci_quirk alc662
+       SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
+       SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
+       SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
++      SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
+       SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
+       SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
+       SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
diff --git a/queue-6.1/alsa-usb-audio-add-the-quirk-for-kt0206-device.patch b/queue-6.1/alsa-usb-audio-add-the-quirk-for-kt0206-device.patch
new file mode 100644 (file)
index 0000000..eb28013
--- /dev/null
@@ -0,0 +1,32 @@
+From 696b66ac26ef953aed5783ef26a252ec8f207013 Mon Sep 17 00:00:00 2001
+From: wangdicheng <wangdicheng@kylinos.cn>
+Date: Wed, 7 Dec 2022 16:20:36 +0800
+Subject: ALSA: usb-audio: add the quirk for KT0206 device
+
+From: wangdicheng <wangdicheng@kylinos.cn>
+
+commit 696b66ac26ef953aed5783ef26a252ec8f207013 upstream.
+
+Add relevant information to the quirks-table.h file.
+The test passes and the sound source file plays normally.
+
+Signed-off-by: wangdicheng <wangdicheng@kylinos.cn>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/SG2PR02MB587849631CB96809CF90DBED8A1A9@SG2PR02MB5878.apcprd02.prod.outlook.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/usb/quirks-table.h |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/sound/usb/quirks-table.h
++++ b/sound/usb/quirks-table.h
+@@ -76,6 +76,8 @@
+ { USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f0a) },
+ /* E-Mu 0204 USB */
+ { USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f19) },
++/* Ktmicro Usb_audio device */
++{ USB_DEVICE_VENDOR_SPEC(0x31b2, 0x0011) },
+ /*
+  * Creative Technology, Ltd Live! Cam Sync HD [VF0770]
diff --git a/queue-6.1/alsa-usb-audio-workaround-for-xrun-at-prepare.patch b/queue-6.1/alsa-usb-audio-workaround-for-xrun-at-prepare.patch
new file mode 100644 (file)
index 0000000..61fc28b
--- /dev/null
@@ -0,0 +1,76 @@
+From 198dde085ecc0138e4f0b0b69d18a0c870f2dea6 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 5 Dec 2022 14:21:24 +0100
+Subject: ALSA: usb-audio: Workaround for XRUN at prepare
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 198dde085ecc0138e4f0b0b69d18a0c870f2dea6 upstream.
+
+Under certain situations (typically in the implicit feedback mode),
+USB-audio driver starts a playback stream already at PCM prepare call
+even before the actual PCM trigger-START call.  For implicit feedback
+mode, this effectively starts two streams for data and sync
+endpoints, and if a coupled sync stream gets XRUN at this point, it
+results in an error -EPIPE.
+
+The problem is that currently we return -EPIPE error as is from the
+prepare.  Then application tries to recover again via the prepare
+call, but it'll fail again because the sync-stop is missing.  The
+sync-stop is missing because it's an internal trigger call (hence the
+PCM core isn't involved).
+
+Since we'll need to re-issue the prepare in anyway when trapped into
+this pitfall, this patch attempts to address it in a bit different
+way; namely, the driver tries to prepare once again after syncing the
+stop manually by itself -- so applications don't see the internal
+error.  At the second failure, we report the error as is, but this
+shouldn't happen in normal situations.
+
+Reported-and-tested-by: Carl Hetherington <lists@carlh.net>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/b4e71631-4a94-613-27b2-fb595792630@carlh.net
+Link: https://lore.kernel.org/r/20221205132124.11585-4-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/usb/pcm.c |   13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+--- a/sound/usb/pcm.c
++++ b/sound/usb/pcm.c
+@@ -604,6 +604,7 @@ static int snd_usb_pcm_prepare(struct sn
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_usb_substream *subs = runtime->private_data;
+       struct snd_usb_audio *chip = subs->stream->chip;
++      int retry = 0;
+       int ret;
+       ret = snd_usb_lock_shutdown(chip);
+@@ -614,6 +615,7 @@ static int snd_usb_pcm_prepare(struct sn
+               goto unlock;
+       }
++ again:
+       if (subs->sync_endpoint) {
+               ret = snd_usb_endpoint_prepare(chip, subs->sync_endpoint);
+               if (ret < 0)
+@@ -638,9 +640,16 @@ static int snd_usb_pcm_prepare(struct sn
+       subs->lowlatency_playback = lowlatency_playback_available(runtime, subs);
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
+-          !subs->lowlatency_playback)
++          !subs->lowlatency_playback) {
+               ret = start_endpoints(subs);
+-
++              /* if XRUN happens at starting streams (possibly with implicit
++               * fb case), restart again, but only try once.
++               */
++              if (ret == -EPIPE && !retry++) {
++                      sync_pending_stops(subs);
++                      goto again;
++              }
++      }
+  unlock:
+       snd_usb_unlock_shutdown(chip);
+       return ret;
diff --git a/queue-6.1/arm64-dts-qcom-sm6350-fix-usb-dp-phy-registers.patch b/queue-6.1/arm64-dts-qcom-sm6350-fix-usb-dp-phy-registers.patch
new file mode 100644 (file)
index 0000000..2323f3a
--- /dev/null
@@ -0,0 +1,47 @@
+From 347b9491c595d5091bfabe65cad2fd6eee786153 Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan+linaro@kernel.org>
+Date: Fri, 11 Nov 2022 10:47:28 +0100
+Subject: arm64: dts: qcom: sm6350: fix USB-DP PHY registers
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+commit 347b9491c595d5091bfabe65cad2fd6eee786153 upstream.
+
+When adding support for the DisplayPort part of the QMP PHY the binding
+(and devicetree parser) for the (USB) child node was simply reused and
+this has lead to some confusion.
+
+The third DP register region is really the DP_PHY region, not "PCS" as
+the binding claims, and lie at offset 0x2a00 (not 0x2c00).
+
+Similarly, there likely are no "RX", "RX2" or "PCS_MISC" regions as
+there are for the USB part of the PHY (and in any case the Linux driver
+does not use them).
+
+Note that the sixth "PCS_MISC" region is not even in the binding.
+
+Fixes: 23737b9557fe ("arm64: dts: qcom: sm6350: Add USB1 nodes")
+Cc: stable@vger.kernel.org      # 5.16
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Link: https://lore.kernel.org/r/20221111094729.11842-2-johan+linaro@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm64/boot/dts/qcom/sm6350.dtsi |    5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/arch/arm64/boot/dts/qcom/sm6350.dtsi
++++ b/arch/arm64/boot/dts/qcom/sm6350.dtsi
+@@ -1150,10 +1150,9 @@
+                       dp_phy: dp-phy@88ea200 {
+                               reg = <0 0x088ea200 0 0x200>,
+                                     <0 0x088ea400 0 0x200>,
+-                                    <0 0x088eac00 0 0x400>,
++                                    <0 0x088eaa00 0 0x200>,
+                                     <0 0x088ea600 0 0x200>,
+-                                    <0 0x088ea800 0 0x200>,
+-                                    <0 0x088eaa00 0 0x100>;
++                                    <0 0x088ea800 0 0x200>;
+                               #phy-cells = <0>;
+                               #clock-cells = <1>;
+                       };
diff --git a/queue-6.1/arm64-dts-qcom-sm8250-fix-usb-dp-phy-registers.patch b/queue-6.1/arm64-dts-qcom-sm8250-fix-usb-dp-phy-registers.patch
new file mode 100644 (file)
index 0000000..67b5590
--- /dev/null
@@ -0,0 +1,47 @@
+From f8d8840c72b3df61b5252052b79020dabec01ab5 Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan+linaro@kernel.org>
+Date: Fri, 11 Nov 2022 10:47:29 +0100
+Subject: arm64: dts: qcom: sm8250: fix USB-DP PHY registers
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+commit f8d8840c72b3df61b5252052b79020dabec01ab5 upstream.
+
+When adding support for the DisplayPort part of the QMP PHY the binding
+(and devicetree parser) for the (USB) child node was simply reused and
+this has lead to some confusion.
+
+The third DP register region is really the DP_PHY region, not "PCS" as
+the binding claims, and lie at offset 0x2a00 (not 0x2c00).
+
+Similarly, there likely are no "RX", "RX2" or "PCS_MISC" regions as
+there are for the USB part of the PHY (and in any case the Linux driver
+does not use them).
+
+Note that the sixth "PCS_MISC" region is not even in the binding.
+
+Fixes: 5aa0d1becd5b ("arm64: dts: qcom: sm8250: switch usb1 qmp phy to USB3+DP mode")
+Cc: stable@vger.kernel.org      # 5.13
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Link: https://lore.kernel.org/r/20221111094729.11842-3-johan+linaro@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm64/boot/dts/qcom/sm8250.dtsi |    5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/arch/arm64/boot/dts/qcom/sm8250.dtsi
++++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+@@ -2892,10 +2892,9 @@
+                       dp_phy: dp-phy@88ea200 {
+                               reg = <0 0x088ea200 0 0x200>,
+                                     <0 0x088ea400 0 0x200>,
+-                                    <0 0x088eac00 0 0x400>,
++                                    <0 0x088eaa00 0 0x200>,
+                                     <0 0x088ea600 0 0x200>,
+-                                    <0 0x088ea800 0 0x200>,
+-                                    <0 0x088eaa00 0 0x100>;
++                                    <0 0x088ea800 0 0x200>;
+                               #phy-cells = <0>;
+                               #clock-cells = <1>;
+                       };
diff --git a/queue-6.1/clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-clk.patch b/queue-6.1/clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-clk.patch
new file mode 100644 (file)
index 0000000..129913f
--- /dev/null
@@ -0,0 +1,52 @@
+From ed1f4ccfe947a3e1018a3bd7325134574c7ff9b3 Mon Sep 17 00:00:00 2001
+From: Li Jun <jun.li@nxp.com>
+Date: Fri, 30 Sep 2022 22:54:22 +0800
+Subject: clk: imx: imx8mp: add shared clk gate for usb suspend clk
+
+From: Li Jun <jun.li@nxp.com>
+
+commit ed1f4ccfe947a3e1018a3bd7325134574c7ff9b3 upstream.
+
+32K usb suspend clock gate is shared with usb_root_clk, this
+shared clock gate was initially defined only for usb suspend
+clock, usb suspend clk is kept on while system is active or
+system sleep with usb wakeup enabled, so usb root clock is
+fine with this situation; with the commit cf7f3f4fa9e5
+("clk: imx8mp: fix usb_root_clk parent"), this clock gate is
+changed to be for usb root clock, but usb root clock will
+be off while usb is suspended, so usb suspend clock will be
+gated too, this cause some usb functionalities will not work,
+so define this clock to be a shared clock gate to conform with
+the real HW status.
+
+Fixes: 9c140d9926761 ("clk: imx: Add support for i.MX8MP clock driver")
+Cc: stable@vger.kernel.org # v5.19+
+Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
+Signed-off-by: Li Jun <jun.li@nxp.com>
+Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
+Link: https://lore.kernel.org/r/1664549663-20364-2-git-send-email-jun.li@nxp.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/clk/imx/clk-imx8mp.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/clk/imx/clk-imx8mp.c
++++ b/drivers/clk/imx/clk-imx8mp.c
+@@ -17,6 +17,7 @@
+ static u32 share_count_nand;
+ static u32 share_count_media;
++static u32 share_count_usb;
+ static const char * const pll_ref_sels[] = { "osc_24m", "dummy", "dummy", "dummy", };
+ static const char * const audio_pll1_bypass_sels[] = {"audio_pll1", "audio_pll1_ref_sel", };
+@@ -673,7 +674,8 @@ static int imx8mp_clocks_probe(struct pl
+       hws[IMX8MP_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", ccm_base + 0x44a0, 0);
+       hws[IMX8MP_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", ccm_base + 0x44b0, 0);
+       hws[IMX8MP_CLK_UART4_ROOT] = imx_clk_hw_gate4("uart4_root_clk", "uart4", ccm_base + 0x44c0, 0);
+-      hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate4("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0);
++      hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate2_shared2("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0, &share_count_usb);
++      hws[IMX8MP_CLK_USB_SUSP] = imx_clk_hw_gate2_shared2("usb_suspend_clk", "osc_32k", ccm_base + 0x44d0, 0, &share_count_usb);
+       hws[IMX8MP_CLK_USB_PHY_ROOT] = imx_clk_hw_gate4("usb_phy_root_clk", "usb_phy_ref", ccm_base + 0x44f0, 0);
+       hws[IMX8MP_CLK_USDHC1_ROOT] = imx_clk_hw_gate4("usdhc1_root_clk", "usdhc1", ccm_base + 0x4510, 0);
+       hws[IMX8MP_CLK_USDHC2_ROOT] = imx_clk_hw_gate4("usdhc2_root_clk", "usdhc2", ccm_base + 0x4520, 0);
diff --git a/queue-6.1/dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clock.patch b/queue-6.1/dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clock.patch
new file mode 100644 (file)
index 0000000..0af9821
--- /dev/null
@@ -0,0 +1,36 @@
+From 5c1f7f1090947d494c30042123e0ec846f696336 Mon Sep 17 00:00:00 2001
+From: Li Jun <jun.li@nxp.com>
+Date: Fri, 30 Sep 2022 22:54:21 +0800
+Subject: dt-bindings: clocks: imx8mp: Add ID for usb suspend clock
+
+From: Li Jun <jun.li@nxp.com>
+
+commit 5c1f7f1090947d494c30042123e0ec846f696336 upstream.
+
+usb suspend clock has a gate shared with usb_root_clk.
+
+Fixes: 9c140d9926761 ("clk: imx: Add support for i.MX8MP clock driver")
+Cc: stable@vger.kernel.org # v5.19+
+Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
+Signed-off-by: Li Jun <jun.li@nxp.com>
+Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
+Link: https://lore.kernel.org/r/1664549663-20364-1-git-send-email-jun.li@nxp.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/dt-bindings/clock/imx8mp-clock.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/include/dt-bindings/clock/imx8mp-clock.h
++++ b/include/dt-bindings/clock/imx8mp-clock.h
+@@ -324,8 +324,9 @@
+ #define IMX8MP_CLK_CLKOUT2_SEL                        317
+ #define IMX8MP_CLK_CLKOUT2_DIV                        318
+ #define IMX8MP_CLK_CLKOUT2                    319
++#define IMX8MP_CLK_USB_SUSP                   320
+-#define IMX8MP_CLK_END                                320
++#define IMX8MP_CLK_END                                321
+ #define IMX8MP_CLK_AUDIOMIX_SAI1_IPG          0
+ #define IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1                1
diff --git a/queue-6.1/hid-logitech-hidpp-guard-ff-init-code-against-non-usb-devices.patch b/queue-6.1/hid-logitech-hidpp-guard-ff-init-code-against-non-usb-devices.patch
new file mode 100644 (file)
index 0000000..022412f
--- /dev/null
@@ -0,0 +1,55 @@
+From 0e13e7b448005612972eae36c0f698c21d1e2f8a Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Thu, 15 Dec 2022 16:44:16 +0100
+Subject: HID: logitech-hidpp: Guard FF init code against non-USB devices
+
+From: Bastien Nocera <hadess@hadess.net>
+
+commit 0e13e7b448005612972eae36c0f698c21d1e2f8a upstream.
+
+The Force Feedback code assumes that all the devices passed to it will
+be USB devices, but that might not be the case for emulated devices.
+Guard against a crash by checking the device type before poking at USB
+properties.
+
+Cc: stable@vger.kernel.org # v5.16+
+Reported-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
+Signed-off-by: Bastien Nocera <hadess@hadess.net>
+Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
+Link: https://lore.kernel.org/r/20221215154416.111704-1-hadess@hadess.net
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/hid/hid-logitech-hidpp.c |   11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+--- a/drivers/hid/hid-logitech-hidpp.c
++++ b/drivers/hid/hid-logitech-hidpp.c
+@@ -2548,12 +2548,17 @@ static int hidpp_ff_init(struct hidpp_de
+       struct hid_device *hid = hidpp->hid_dev;
+       struct hid_input *hidinput;
+       struct input_dev *dev;
+-      const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor);
+-      const u16 bcdDevice = le16_to_cpu(udesc->bcdDevice);
++      struct usb_device_descriptor *udesc;
++      u16 bcdDevice;
+       struct ff_device *ff;
+       int error, j, num_slots = data->num_effects;
+       u8 version;
++      if (!hid_is_usb(hid)) {
++              hid_err(hid, "device is not USB\n");
++              return -ENODEV;
++      }
++
+       if (list_empty(&hid->inputs)) {
+               hid_err(hid, "no inputs found\n");
+               return -ENODEV;
+@@ -2567,6 +2572,8 @@ static int hidpp_ff_init(struct hidpp_de
+       }
+       /* Get firmware release */
++      udesc = &(hid_to_usb_dev(hid)->descriptor);
++      bcdDevice = le16_to_cpu(udesc->bcdDevice);
+       version = bcdDevice & 255;
+       /* Set supported force feedback capabilities */
index 3dcd2dc8ecc31a2865d4caaffe3e19e5c6fe1bf7..1e652072c4f68ff632bf4a5cf5f1b9fbeda9da45 100644 (file)
@@ -1097,3 +1097,18 @@ input-iqs7222-add-support-for-iqs7222a-v1.13.patch
 dt-bindings-input-iqs7222-reduce-linux-code-to-optio.patch
 dt-bindings-input-iqs7222-correct-minimum-slider-siz.patch
 dt-bindings-input-iqs7222-add-support-for-iqs7222a-v.patch
+alsa-usb-audio-workaround-for-xrun-at-prepare.patch
+alsa-usb-audio-add-the-quirk-for-kt0206-device.patch
+alsa-hda-realtek-add-quirk-for-lenovo-tianyi510pro-14iob.patch
+alsa-hda-hdmi-add-hp-device-0x8711-to-force-connect-list.patch
+hid-logitech-hidpp-guard-ff-init-code-against-non-usb-devices.patch
+usb-cdnsp-fix-lack-of-zlp-for-ep0.patch
+usb-xhci-mtk-fix-leakage-of-shared-hcd-when-fail-to-set-wakeup-irq.patch
+arm64-dts-qcom-sm6350-fix-usb-dp-phy-registers.patch
+arm64-dts-qcom-sm8250-fix-usb-dp-phy-registers.patch
+dt-bindings-clocks-imx8mp-add-id-for-usb-suspend-clock.patch
+clk-imx-imx8mp-add-shared-clk-gate-for-usb-suspend-clk.patch
+usb-dwc3-fix-race-between-dwc3_set_mode-and-__dwc3_set_mode.patch
+usb-dwc3-core-defer-probe-on-ulpi_read_id-timeout.patch
+usb-dwc3-qcom-fix-memory-leak-in-dwc3_qcom_interconnect_init.patch
+xhci-prevent-infinite-loop-in-transaction-errors-recovery-for-streams.patch
diff --git a/queue-6.1/usb-cdnsp-fix-lack-of-zlp-for-ep0.patch b/queue-6.1/usb-cdnsp-fix-lack-of-zlp-for-ep0.patch
new file mode 100644 (file)
index 0000000..5329407
--- /dev/null
@@ -0,0 +1,104 @@
+From ae423ef5d095e09970f52c08020fdbf7f9d87c22 Mon Sep 17 00:00:00 2001
+From: Pawel Laszczak <pawell@cadence.com>
+Date: Tue, 22 Nov 2022 03:51:38 -0500
+Subject: usb: cdnsp: fix lack of ZLP for ep0
+
+From: Pawel Laszczak <pawell@cadence.com>
+
+commit ae423ef5d095e09970f52c08020fdbf7f9d87c22 upstream.
+
+Patch implements the handling of ZLP for control transfer.
+To send the ZLP driver must prepare the extra TRB in TD with
+length set to zero and TRB type to TRB_NORMAL.
+The first TRB must have set TRB_CHAIN flag, TD_SIZE = 1
+and TRB type to TRB_DATA.
+
+Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver")
+cc: <stable@vger.kernel.org>
+Reviewed-by: Peter Chen <peter.chen@kernel.org>
+Signed-off-by: Pawel Laszczak <pawell@cadence.com>
+Link: https://lore.kernel.org/r/20221122085138.332434-1-pawell@cadence.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/cdns3/cdnsp-ring.c |   42 +++++++++++++++++++++++++++++++----------
+ 1 file changed, 32 insertions(+), 10 deletions(-)
+
+--- a/drivers/usb/cdns3/cdnsp-ring.c
++++ b/drivers/usb/cdns3/cdnsp-ring.c
+@@ -2006,10 +2006,11 @@ int cdnsp_queue_bulk_tx(struct cdnsp_dev
+ int cdnsp_queue_ctrl_tx(struct cdnsp_device *pdev, struct cdnsp_request *preq)
+ {
+-      u32 field, length_field, remainder;
++      u32 field, length_field, zlp = 0;
+       struct cdnsp_ep *pep = preq->pep;
+       struct cdnsp_ring *ep_ring;
+       int num_trbs;
++      u32 maxp;
+       int ret;
+       ep_ring = cdnsp_request_to_transfer_ring(pdev, preq);
+@@ -2019,26 +2020,33 @@ int cdnsp_queue_ctrl_tx(struct cdnsp_dev
+       /* 1 TRB for data, 1 for status */
+       num_trbs = (pdev->three_stage_setup) ? 2 : 1;
++      maxp = usb_endpoint_maxp(pep->endpoint.desc);
++
++      if (preq->request.zero && preq->request.length &&
++          (preq->request.length % maxp == 0)) {
++              num_trbs++;
++              zlp = 1;
++      }
++
+       ret = cdnsp_prepare_transfer(pdev, preq, num_trbs);
+       if (ret)
+               return ret;
+       /* If there's data, queue data TRBs */
+-      if (pdev->ep0_expect_in)
+-              field = TRB_TYPE(TRB_DATA) | TRB_IOC;
+-      else
+-              field = TRB_ISP | TRB_TYPE(TRB_DATA) | TRB_IOC;
+-
+       if (preq->request.length > 0) {
+-              remainder = cdnsp_td_remainder(pdev, 0, preq->request.length,
+-                                             preq->request.length, preq, 1, 0);
++              field = TRB_TYPE(TRB_DATA);
+-              length_field = TRB_LEN(preq->request.length) |
+-                              TRB_TD_SIZE(remainder) | TRB_INTR_TARGET(0);
++              if (zlp)
++                      field |= TRB_CHAIN;
++              else
++                      field |= TRB_IOC | (pdev->ep0_expect_in ? 0 : TRB_ISP);
+               if (pdev->ep0_expect_in)
+                       field |= TRB_DIR_IN;
++              length_field = TRB_LEN(preq->request.length) |
++                             TRB_TD_SIZE(zlp) | TRB_INTR_TARGET(0);
++
+               cdnsp_queue_trb(pdev, ep_ring, true,
+                               lower_32_bits(preq->request.dma),
+                               upper_32_bits(preq->request.dma), length_field,
+@@ -2046,6 +2054,20 @@ int cdnsp_queue_ctrl_tx(struct cdnsp_dev
+                               TRB_SETUPID(pdev->setup_id) |
+                               pdev->setup_speed);
++              if (zlp) {
++                      field = TRB_TYPE(TRB_NORMAL) | TRB_IOC;
++
++                      if (!pdev->ep0_expect_in)
++                              field = TRB_ISP;
++
++                      cdnsp_queue_trb(pdev, ep_ring, true,
++                                      lower_32_bits(preq->request.dma),
++                                      upper_32_bits(preq->request.dma), 0,
++                                      field | ep_ring->cycle_state |
++                                      TRB_SETUPID(pdev->setup_id) |
++                                      pdev->setup_speed);
++              }
++
+               pdev->ep0_stage = CDNSP_DATA_STAGE;
+       }
diff --git a/queue-6.1/usb-dwc3-core-defer-probe-on-ulpi_read_id-timeout.patch b/queue-6.1/usb-dwc3-core-defer-probe-on-ulpi_read_id-timeout.patch
new file mode 100644 (file)
index 0000000..f5aa494
--- /dev/null
@@ -0,0 +1,58 @@
+From 63130462c919ece0ad0d9bb5a1f795ef8d79687e Mon Sep 17 00:00:00 2001
+From: Ferry Toth <ftoth@exalondelft.nl>
+Date: Mon, 5 Dec 2022 21:15:27 +0100
+Subject: usb: dwc3: core: defer probe on ulpi_read_id timeout
+
+From: Ferry Toth <ftoth@exalondelft.nl>
+
+commit 63130462c919ece0ad0d9bb5a1f795ef8d79687e upstream.
+
+Since commit 0f0101719138 ("usb: dwc3: Don't switch OTG -> peripheral
+if extcon is present"), Dual Role support on Intel Merrifield platform
+broke due to rearranging the call to dwc3_get_extcon().
+
+It appears to be caused by ulpi_read_id() masking the timeout on the first
+test write. In the past dwc3 probe continued by calling dwc3_core_soft_reset()
+followed by dwc3_get_extcon() which happend to return -EPROBE_DEFER.
+On deferred probe ulpi_read_id() finally succeeded. Due to above mentioned
+rearranging -EPROBE_DEFER is not returned and probe completes without phy.
+
+On Intel Merrifield the timeout on the first test write issue is reproducible
+but it is difficult to find the root cause. Using a mainline kernel and
+rootfs with buildroot ulpi_read_id() succeeds. As soon as adding
+ftrace / bootconfig to find out why, ulpi_read_id() fails and we can't
+analyze the flow. Using another rootfs ulpi_read_id() fails even without
+adding ftrace. We suspect the issue is some kind of timing / race, but
+merely retrying ulpi_read_id() does not resolve the issue.
+
+As we now changed ulpi_read_id() to return -ETIMEDOUT in this case, we
+need to handle the error by calling dwc3_core_soft_reset() and request
+-EPROBE_DEFER. On deferred probe ulpi_read_id() is retried and succeeds.
+
+Fixes: ef6a7bcfb01c ("usb: ulpi: Support device discovery via DT")
+Cc: stable@vger.kernel.org
+Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+Signed-off-by: Ferry Toth <ftoth@exalondelft.nl>
+Link: https://lore.kernel.org/r/20221205201527.13525-3-ftoth@exalondelft.nl
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/dwc3/core.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/dwc3/core.c
++++ b/drivers/usb/dwc3/core.c
+@@ -1100,8 +1100,13 @@ static int dwc3_core_init(struct dwc3 *d
+       if (!dwc->ulpi_ready) {
+               ret = dwc3_core_ulpi_init(dwc);
+-              if (ret)
++              if (ret) {
++                      if (ret == -ETIMEDOUT) {
++                              dwc3_core_soft_reset(dwc);
++                              ret = -EPROBE_DEFER;
++                      }
+                       goto err0;
++              }
+               dwc->ulpi_ready = true;
+       }
diff --git a/queue-6.1/usb-dwc3-fix-race-between-dwc3_set_mode-and-__dwc3_set_mode.patch b/queue-6.1/usb-dwc3-fix-race-between-dwc3_set_mode-and-__dwc3_set_mode.patch
new file mode 100644 (file)
index 0000000..8daff1e
--- /dev/null
@@ -0,0 +1,112 @@
+From 62c73bfea048e66168df09da6d3e4510ecda40bb Mon Sep 17 00:00:00 2001
+From: Sven Peter <sven@svenpeter.dev>
+Date: Mon, 28 Nov 2022 17:15:26 +0100
+Subject: usb: dwc3: Fix race between dwc3_set_mode and __dwc3_set_mode
+
+From: Sven Peter <sven@svenpeter.dev>
+
+commit 62c73bfea048e66168df09da6d3e4510ecda40bb upstream.
+
+dwc->desired_dr_role is changed by dwc3_set_mode inside a spinlock but
+then read by __dwc3_set_mode outside of that lock. This can lead to a
+race condition when very quick successive role switch events happen:
+
+CPU A
+       dwc3_set_mode(DWC3_GCTL_PRTCAP_HOST) // first role switch event
+               spin_lock_irqsave(&dwc->lock, flags);
+               dwc->desired_dr_role = mode; // DWC3_GCTL_PRTCAP_HOST
+               spin_unlock_irqrestore(&dwc->lock, flags);
+               queue_work(system_freezable_wq, &dwc->drd_work);
+
+CPU B
+       __dwc3_set_mode
+               // ....
+               spin_lock_irqsave(&dwc->lock, flags);
+               // desired_dr_role is DWC3_GCTL_PRTCAP_HOST
+               dwc3_set_prtcap(dwc, dwc->desired_dr_role);
+               spin_unlock_irqrestore(&dwc->lock, flags);
+
+CPU A
+       dwc3_set_mode(DWC3_GCTL_PRTCAP_DEVICE) // second event
+               spin_lock_irqsave(&dwc->lock, flags);
+               dwc->desired_dr_role = mode; // DWC3_GCTL_PRTCAP_DEVICE
+               spin_unlock_irqrestore(&dwc->lock, flags);
+
+CPU B (continues running __dwc3_set_mode)
+       switch (dwc->desired_dr_role) { // DWC3_GCTL_PRTCAP_DEVICE
+       // ....
+       case DWC3_GCTL_PRTCAP_DEVICE:
+               // ....
+               ret = dwc3_gadget_init(dwc);
+
+We then have DWC3_GCTL.DWC3_GCTL_PRTCAPDIR = DWC3_GCTL_PRTCAP_HOST and
+dwc->current_dr_role = DWC3_GCTL_PRTCAP_HOST but initialized the
+controller in device mode. It's also possible to get into a state
+where both host and device are intialized at the same time.
+Fix this race by creating a local copy of desired_dr_role inside
+__dwc3_set_mode while holding dwc->lock.
+
+Fixes: 41ce1456e1db ("usb: dwc3: core: make dwc3_set_mode() work properly")
+Cc: stable <stable@kernel.org>
+Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+Signed-off-by: Sven Peter <sven@svenpeter.dev>
+Link: https://lore.kernel.org/r/20221128161526.79730-1-sven@svenpeter.dev
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/dwc3/core.c |   16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+--- a/drivers/usb/dwc3/core.c
++++ b/drivers/usb/dwc3/core.c
+@@ -122,21 +122,25 @@ static void __dwc3_set_mode(struct work_
+       unsigned long flags;
+       int ret;
+       u32 reg;
++      u32 desired_dr_role;
+       mutex_lock(&dwc->mutex);
++      spin_lock_irqsave(&dwc->lock, flags);
++      desired_dr_role = dwc->desired_dr_role;
++      spin_unlock_irqrestore(&dwc->lock, flags);
+       pm_runtime_get_sync(dwc->dev);
+       if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_OTG)
+               dwc3_otg_update(dwc, 0);
+-      if (!dwc->desired_dr_role)
++      if (!desired_dr_role)
+               goto out;
+-      if (dwc->desired_dr_role == dwc->current_dr_role)
++      if (desired_dr_role == dwc->current_dr_role)
+               goto out;
+-      if (dwc->desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
++      if (desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
+               goto out;
+       switch (dwc->current_dr_role) {
+@@ -164,7 +168,7 @@ static void __dwc3_set_mode(struct work_
+        */
+       if (dwc->current_dr_role && ((DWC3_IP_IS(DWC3) ||
+                       DWC3_VER_IS_PRIOR(DWC31, 190A)) &&
+-                      dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) {
++                      desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) {
+               reg = dwc3_readl(dwc->regs, DWC3_GCTL);
+               reg |= DWC3_GCTL_CORESOFTRESET;
+               dwc3_writel(dwc->regs, DWC3_GCTL, reg);
+@@ -184,11 +188,11 @@ static void __dwc3_set_mode(struct work_
+       spin_lock_irqsave(&dwc->lock, flags);
+-      dwc3_set_prtcap(dwc, dwc->desired_dr_role);
++      dwc3_set_prtcap(dwc, desired_dr_role);
+       spin_unlock_irqrestore(&dwc->lock, flags);
+-      switch (dwc->desired_dr_role) {
++      switch (desired_dr_role) {
+       case DWC3_GCTL_PRTCAP_HOST:
+               ret = dwc3_host_init(dwc);
+               if (ret) {
diff --git a/queue-6.1/usb-dwc3-qcom-fix-memory-leak-in-dwc3_qcom_interconnect_init.patch b/queue-6.1/usb-dwc3-qcom-fix-memory-leak-in-dwc3_qcom_interconnect_init.patch
new file mode 100644 (file)
index 0000000..0db4be4
--- /dev/null
@@ -0,0 +1,60 @@
+From 97a48da1619ba6bd42a0e5da0a03aa490a9496b1 Mon Sep 17 00:00:00 2001
+From: Miaoqian Lin <linmq006@gmail.com>
+Date: Tue, 6 Dec 2022 12:17:31 +0400
+Subject: usb: dwc3: qcom: Fix memory leak in dwc3_qcom_interconnect_init
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+commit 97a48da1619ba6bd42a0e5da0a03aa490a9496b1 upstream.
+
+of_icc_get() alloc resources for path handle, we should release it when not
+need anymore. Like the release in dwc3_qcom_interconnect_exit() function.
+Add icc_put() in error handling to fix this.
+
+Fixes: bea46b981515 ("usb: dwc3: qcom: Add interconnect support in dwc3 driver")
+Cc: stable <stable@kernel.org>
+Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Link: https://lore.kernel.org/r/20221206081731.818107-1-linmq006@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/dwc3/dwc3-qcom.c |   13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+--- a/drivers/usb/dwc3/dwc3-qcom.c
++++ b/drivers/usb/dwc3/dwc3-qcom.c
+@@ -261,7 +261,8 @@ static int dwc3_qcom_interconnect_init(s
+       if (IS_ERR(qcom->icc_path_apps)) {
+               dev_err(dev, "failed to get apps-usb path: %ld\n",
+                               PTR_ERR(qcom->icc_path_apps));
+-              return PTR_ERR(qcom->icc_path_apps);
++              ret = PTR_ERR(qcom->icc_path_apps);
++              goto put_path_ddr;
+       }
+       max_speed = usb_get_maximum_speed(&qcom->dwc3->dev);
+@@ -274,16 +275,22 @@ static int dwc3_qcom_interconnect_init(s
+       }
+       if (ret) {
+               dev_err(dev, "failed to set bandwidth for usb-ddr path: %d\n", ret);
+-              return ret;
++              goto put_path_apps;
+       }
+       ret = icc_set_bw(qcom->icc_path_apps, APPS_USB_AVG_BW, APPS_USB_PEAK_BW);
+       if (ret) {
+               dev_err(dev, "failed to set bandwidth for apps-usb path: %d\n", ret);
+-              return ret;
++              goto put_path_apps;
+       }
+       return 0;
++
++put_path_apps:
++      icc_put(qcom->icc_path_apps);
++put_path_ddr:
++      icc_put(qcom->icc_path_ddr);
++      return ret;
+ }
+ /**
diff --git a/queue-6.1/usb-xhci-mtk-fix-leakage-of-shared-hcd-when-fail-to-set-wakeup-irq.patch b/queue-6.1/usb-xhci-mtk-fix-leakage-of-shared-hcd-when-fail-to-set-wakeup-irq.patch
new file mode 100644 (file)
index 0000000..ac0033e
--- /dev/null
@@ -0,0 +1,31 @@
+From 03a88b0bafbe3f548729d970d8366f48718c9b19 Mon Sep 17 00:00:00 2001
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Date: Mon, 28 Nov 2022 14:33:37 +0800
+Subject: usb: xhci-mtk: fix leakage of shared hcd when fail to set wakeup irq
+
+From: Chunfeng Yun <chunfeng.yun@mediatek.com>
+
+commit 03a88b0bafbe3f548729d970d8366f48718c9b19 upstream.
+
+Can not set the @shared_hcd to NULL before decrease the usage count
+by usb_put_hcd(), this will cause the shared hcd not released.
+
+Fixes: 04284eb74e0c ("usb: xhci-mtk: add support runtime PM")
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
+Link: https://lore.kernel.org/r/20221128063337.18124-1-chunfeng.yun@mediatek.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci-mtk.c |    1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/drivers/usb/host/xhci-mtk.c
++++ b/drivers/usb/host/xhci-mtk.c
+@@ -639,7 +639,6 @@ static int xhci_mtk_probe(struct platfor
+ dealloc_usb3_hcd:
+       usb_remove_hcd(xhci->shared_hcd);
+-      xhci->shared_hcd = NULL;
+ dealloc_usb2_hcd:
+       usb_remove_hcd(hcd);
diff --git a/queue-6.1/xhci-prevent-infinite-loop-in-transaction-errors-recovery-for-streams.patch b/queue-6.1/xhci-prevent-infinite-loop-in-transaction-errors-recovery-for-streams.patch
new file mode 100644 (file)
index 0000000..0514606
--- /dev/null
@@ -0,0 +1,83 @@
+From a1575120972ecd7baa6af6a69e4e7ea9213bde7c Mon Sep 17 00:00:00 2001
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+Date: Wed, 30 Nov 2022 11:19:43 +0200
+Subject: xhci: Prevent infinite loop in transaction errors recovery for streams
+
+From: Mathias Nyman <mathias.nyman@linux.intel.com>
+
+commit a1575120972ecd7baa6af6a69e4e7ea9213bde7c upstream.
+
+Make sure to also limit the amount of soft reset retries for transaction
+errors on streams in cases where the transaction error event doesn't point
+to any specific TRB.
+
+In these cases we don't know the TRB or stream ring, but we do know which
+endpoint had the error.
+
+To keep error counting simple and functional, move the current err_count
+from ring structure to endpoint structure.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20221130091944.2171610-6-mathias.nyman@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci-ring.c |   14 ++++++++++----
+ drivers/usb/host/xhci.h      |    2 +-
+ 2 files changed, 11 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -2458,7 +2458,7 @@ static int process_bulk_intr_td(struct x
+       switch (trb_comp_code) {
+       case COMP_SUCCESS:
+-              ep_ring->err_count = 0;
++              ep->err_count = 0;
+               /* handle success with untransferred data as short packet */
+               if (ep_trb != td->last_trb || remaining) {
+                       xhci_warn(xhci, "WARN Successful completion on short TX\n");
+@@ -2484,7 +2484,7 @@ static int process_bulk_intr_td(struct x
+               break;
+       case COMP_USB_TRANSACTION_ERROR:
+               if (xhci->quirks & XHCI_NO_SOFT_RETRY ||
+-                  (ep_ring->err_count++ > MAX_SOFT_RETRY) ||
++                  (ep->err_count++ > MAX_SOFT_RETRY) ||
+                   le32_to_cpu(slot_ctx->tt_info) & TT_SLOT)
+                       break;
+@@ -2565,8 +2565,14 @@ static int handle_tx_event(struct xhci_h
+               case COMP_USB_TRANSACTION_ERROR:
+               case COMP_INVALID_STREAM_TYPE_ERROR:
+               case COMP_INVALID_STREAM_ID_ERROR:
+-                      xhci_handle_halted_endpoint(xhci, ep, 0, NULL,
+-                                                  EP_SOFT_RESET);
++                      xhci_dbg(xhci, "Stream transaction error ep %u no id\n",
++                               ep_index);
++                      if (ep->err_count++ > MAX_SOFT_RETRY)
++                              xhci_handle_halted_endpoint(xhci, ep, 0, NULL,
++                                                          EP_HARD_RESET);
++                      else
++                              xhci_handle_halted_endpoint(xhci, ep, 0, NULL,
++                                                          EP_SOFT_RESET);
+                       goto cleanup;
+               case COMP_RING_UNDERRUN:
+               case COMP_RING_OVERRUN:
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -933,6 +933,7 @@ struct xhci_virt_ep {
+        * have to restore the device state to the previous state
+        */
+       struct xhci_ring                *new_ring;
++      unsigned int                    err_count;
+       unsigned int                    ep_state;
+ #define SET_DEQ_PENDING               (1 << 0)
+ #define EP_HALTED             (1 << 1)        /* For stall handling */
+@@ -1627,7 +1628,6 @@ struct xhci_ring {
+        * if we own the TRB (if we are the consumer).  See section 4.9.1.
+        */
+       u32                     cycle_state;
+-      unsigned int            err_count;
+       unsigned int            stream_id;
+       unsigned int            num_segs;
+       unsigned int            num_trbs_free;