]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.12-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 24 May 2025 15:51:46 +0000 (17:51 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 24 May 2025 15:51:46 +0000 (17:51 +0200)
added patches:
alsa-hda-realtek-add-quirk-for-lenovo-yoga-pro-7-14asp10.patch
alsa-pcm-fix-race-of-buffer-access-at-pcm-oss-layer.patch
asoc-sof-intel-hda-bus-use-pio-mode-on-ace2-platforms.patch
asoc-sof-ipc4-control-use-sof_ctrl_cmd_binary-as-numid-for-bytes_ext.patch
asoc-sof-ipc4-pcm-delay-reporting-is-only-supported-for-playback-direction.patch
asoc-sof-topology-connect-dai-to-a-single-dai-link.patch
can-kvaser_pciefd-continue-parsing-dma-buf-after-dropped-rx.patch
can-kvaser_pciefd-fix-echo_skb-race.patch
llc-fix-data-loss-when-reading-from-a-socket-in-llc_ui_recvmsg.patch
mmc-sdhci-of-dwcmshc-add-pd-workaround-on-rk3576.patch
net-dsa-microchip-linearize-skb-for-tail-tagging-switches.patch
pmdomain-core-fix-error-checking-in-genpd_dev_pm_attach_by_id.patch
pmdomain-renesas-rcar-remove-obsolete-nullify-checks.patch
vmxnet3-update-mtu-after-device-quiesce.patch

15 files changed:
queue-6.12/alsa-hda-realtek-add-quirk-for-lenovo-yoga-pro-7-14asp10.patch [new file with mode: 0644]
queue-6.12/alsa-pcm-fix-race-of-buffer-access-at-pcm-oss-layer.patch [new file with mode: 0644]
queue-6.12/asoc-sof-intel-hda-bus-use-pio-mode-on-ace2-platforms.patch [new file with mode: 0644]
queue-6.12/asoc-sof-ipc4-control-use-sof_ctrl_cmd_binary-as-numid-for-bytes_ext.patch [new file with mode: 0644]
queue-6.12/asoc-sof-ipc4-pcm-delay-reporting-is-only-supported-for-playback-direction.patch [new file with mode: 0644]
queue-6.12/asoc-sof-topology-connect-dai-to-a-single-dai-link.patch [new file with mode: 0644]
queue-6.12/can-kvaser_pciefd-continue-parsing-dma-buf-after-dropped-rx.patch [new file with mode: 0644]
queue-6.12/can-kvaser_pciefd-fix-echo_skb-race.patch [new file with mode: 0644]
queue-6.12/llc-fix-data-loss-when-reading-from-a-socket-in-llc_ui_recvmsg.patch [new file with mode: 0644]
queue-6.12/mmc-sdhci-of-dwcmshc-add-pd-workaround-on-rk3576.patch [new file with mode: 0644]
queue-6.12/net-dsa-microchip-linearize-skb-for-tail-tagging-switches.patch [new file with mode: 0644]
queue-6.12/pmdomain-core-fix-error-checking-in-genpd_dev_pm_attach_by_id.patch [new file with mode: 0644]
queue-6.12/pmdomain-renesas-rcar-remove-obsolete-nullify-checks.patch [new file with mode: 0644]
queue-6.12/series
queue-6.12/vmxnet3-update-mtu-after-device-quiesce.patch [new file with mode: 0644]

diff --git a/queue-6.12/alsa-hda-realtek-add-quirk-for-lenovo-yoga-pro-7-14asp10.patch b/queue-6.12/alsa-hda-realtek-add-quirk-for-lenovo-yoga-pro-7-14asp10.patch
new file mode 100644 (file)
index 0000000..20ab9c9
--- /dev/null
@@ -0,0 +1,32 @@
+From 8d70503068510e6080c2c649cccb154f16de26c9 Mon Sep 17 00:00:00 2001
+From: Ed Burcher <git@edburcher.com>
+Date: Mon, 19 May 2025 23:49:07 +0100
+Subject: ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 14ASP10
+
+From: Ed Burcher <git@edburcher.com>
+
+commit 8d70503068510e6080c2c649cccb154f16de26c9 upstream.
+
+Lenovo Yoga Pro 7 (gen 10) with Realtek ALC3306 and combined CS35L56
+amplifiers need quirk ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN to
+enable bass
+
+Signed-off-by: Ed Burcher <git@edburcher.com>
+Cc: <stable@vger.kernel.org>
+Link: https://patch.msgid.link/20250519224907.31265-2-git@edburcher.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/patch_realtek.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -11182,6 +11182,7 @@ static const struct hda_quirk alc269_fix
+       SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
+       SND_PCI_QUIRK(0x17aa, 0x38fd, "ThinkBook plus Gen5 Hybrid", ALC287_FIXUP_TAS2781_I2C),
+       SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
++      SND_PCI_QUIRK(0x17aa, 0x390d, "Lenovo Yoga Pro 7 14ASP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
+       SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC),
+       SND_PCI_QUIRK(0x17aa, 0x391f, "Yoga S990-16 pro Quad YC Quad", ALC287_FIXUP_TAS2781_I2C),
+       SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TAS2781_I2C),
diff --git a/queue-6.12/alsa-pcm-fix-race-of-buffer-access-at-pcm-oss-layer.patch b/queue-6.12/alsa-pcm-fix-race-of-buffer-access-at-pcm-oss-layer.patch
new file mode 100644 (file)
index 0000000..3226a9a
--- /dev/null
@@ -0,0 +1,74 @@
+From 93a81ca0657758b607c3f4ba889ae806be9beb73 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Fri, 16 May 2025 10:08:16 +0200
+Subject: ALSA: pcm: Fix race of buffer access at PCM OSS layer
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 93a81ca0657758b607c3f4ba889ae806be9beb73 upstream.
+
+The PCM OSS layer tries to clear the buffer with the silence data at
+initialization (or reconfiguration) of a stream with the explicit call
+of snd_pcm_format_set_silence() with runtime->dma_area.  But this may
+lead to a UAF because the accessed runtime->dma_area might be freed
+concurrently, as it's performed outside the PCM ops.
+
+For avoiding it, move the code into the PCM core and perform it inside
+the buffer access lock, so that it won't be changed during the
+operation.
+
+Reported-by: syzbot+32d4647f551007595173@syzkaller.appspotmail.com
+Closes: https://lore.kernel.org/68164d8e.050a0220.11da1b.0019.GAE@google.com
+Cc: <stable@vger.kernel.org>
+Link: https://patch.msgid.link/20250516080817.20068-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/sound/pcm.h      |    2 ++
+ sound/core/oss/pcm_oss.c |    3 +--
+ sound/core/pcm_native.c  |   11 +++++++++++
+ 3 files changed, 14 insertions(+), 2 deletions(-)
+
+--- a/include/sound/pcm.h
++++ b/include/sound/pcm.h
+@@ -1428,6 +1428,8 @@ int snd_pcm_lib_mmap_iomem(struct snd_pc
+ #define snd_pcm_lib_mmap_iomem        NULL
+ #endif
++void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime);
++
+ /**
+  * snd_pcm_limit_isa_dma_size - Get the max size fitting with ISA DMA transfer
+  * @dma: DMA number
+--- a/sound/core/oss/pcm_oss.c
++++ b/sound/core/oss/pcm_oss.c
+@@ -1074,8 +1074,7 @@ static int snd_pcm_oss_change_params_loc
+       runtime->oss.params = 0;
+       runtime->oss.prepare = 1;
+       runtime->oss.buffer_used = 0;
+-      if (runtime->dma_area)
+-              snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes));
++      snd_pcm_runtime_buffer_set_silence(runtime);
+       runtime->oss.period_frames = snd_pcm_alsa_frames(substream, oss_period_size);
+--- a/sound/core/pcm_native.c
++++ b/sound/core/pcm_native.c
+@@ -723,6 +723,17 @@ static void snd_pcm_buffer_access_unlock
+       atomic_inc(&runtime->buffer_accessing);
+ }
++/* fill the PCM buffer with the current silence format; called from pcm_oss.c */
++void snd_pcm_runtime_buffer_set_silence(struct snd_pcm_runtime *runtime)
++{
++      snd_pcm_buffer_access_lock(runtime);
++      if (runtime->dma_area)
++              snd_pcm_format_set_silence(runtime->format, runtime->dma_area,
++                                         bytes_to_samples(runtime, runtime->dma_bytes));
++      snd_pcm_buffer_access_unlock(runtime);
++}
++EXPORT_SYMBOL_GPL(snd_pcm_runtime_buffer_set_silence);
++
+ #if IS_ENABLED(CONFIG_SND_PCM_OSS)
+ #define is_oss_stream(substream)      ((substream)->oss.oss)
+ #else
diff --git a/queue-6.12/asoc-sof-intel-hda-bus-use-pio-mode-on-ace2-platforms.patch b/queue-6.12/asoc-sof-intel-hda-bus-use-pio-mode-on-ace2-platforms.patch
new file mode 100644 (file)
index 0000000..254db03
--- /dev/null
@@ -0,0 +1,40 @@
+From 4e7010826e96702d7fad13dbe85de4e94052f833 Mon Sep 17 00:00:00 2001
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Date: Fri, 9 May 2025 11:13:08 +0300
+Subject: ASoC: SOF: Intel: hda-bus: Use PIO mode on ACE2+ platforms
+
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+
+commit 4e7010826e96702d7fad13dbe85de4e94052f833 upstream.
+
+Keep using the PIO mode for commands on ACE2+ platforms, similarly how
+the legacy stack is configured.
+
+Fixes: 05cf17f1bf6d ("ASoC: SOF: Intel: hda-bus: Use PIO mode for Lunar Lake")
+Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Cc: stable@vger.kernel.org
+Link: https://patch.msgid.link/20250509081308.13784-1-peter.ujfalusi@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/sof/intel/hda-bus.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/soc/sof/intel/hda-bus.c b/sound/soc/sof/intel/hda-bus.c
+index b1be03011d7e..6492e1cefbfb 100644
+--- a/sound/soc/sof/intel/hda-bus.c
++++ b/sound/soc/sof/intel/hda-bus.c
+@@ -76,7 +76,7 @@ void sof_hda_bus_init(struct snd_sof_dev *sdev, struct device *dev)
+       snd_hdac_ext_bus_init(bus, dev, &bus_core_ops, sof_hda_ext_ops);
+-      if (chip && chip->hw_ip_version == SOF_INTEL_ACE_2_0)
++      if (chip && chip->hw_ip_version >= SOF_INTEL_ACE_2_0)
+               bus->use_pio_for_commands = true;
+ #else
+       snd_hdac_ext_bus_init(bus, dev, NULL, NULL);
+-- 
+2.49.0
+
diff --git a/queue-6.12/asoc-sof-ipc4-control-use-sof_ctrl_cmd_binary-as-numid-for-bytes_ext.patch b/queue-6.12/asoc-sof-ipc4-control-use-sof_ctrl_cmd_binary-as-numid-for-bytes_ext.patch
new file mode 100644 (file)
index 0000000..6a411a4
--- /dev/null
@@ -0,0 +1,64 @@
+From 4d14b1069e9e672dbe1adab52594076da6f4a62d Mon Sep 17 00:00:00 2001
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Date: Fri, 9 May 2025 11:56:33 +0300
+Subject: ASoC: SOF: ipc4-control: Use SOF_CTRL_CMD_BINARY as numid for bytes_ext
+
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+
+commit 4d14b1069e9e672dbe1adab52594076da6f4a62d upstream.
+
+The header.numid is set to scontrol->comp_id in bytes_ext_get and it is
+ignored during bytes_ext_put.
+The use of comp_id is not quite great as it is kernel internal
+identification number.
+
+Set the header.numid to SOF_CTRL_CMD_BINARY during get and validate the
+numid during put to provide consistent and compatible identification
+number as IPC3.
+
+For IPC4 existing tooling also ignored the numid but with the use of
+SOF_CTRL_CMD_BINARY the different handling of the blobs can be dropped,
+providing better user experience.
+
+Reported-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
+Closes: https://github.com/thesofproject/linux/issues/5282
+Fixes: a062c8899fed ("ASoC: SOF: ipc4-control: Add support for bytes control get and put")
+Cc: stable@vger.kernel.org
+Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Reviewed-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
+Link: https://patch.msgid.link/20250509085633.14930-1-peter.ujfalusi@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/sof/ipc4-control.c |   11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+--- a/sound/soc/sof/ipc4-control.c
++++ b/sound/soc/sof/ipc4-control.c
+@@ -531,6 +531,14 @@ static int sof_ipc4_bytes_ext_put(struct
+               return -EINVAL;
+       }
++      /* Check header id */
++      if (header.numid != SOF_CTRL_CMD_BINARY) {
++              dev_err_ratelimited(scomp->dev,
++                                  "Incorrect numid for bytes put %d\n",
++                                  header.numid);
++              return -EINVAL;
++      }
++
+       /* Verify the ABI header first */
+       if (copy_from_user(&abi_hdr, tlvd->tlv, sizeof(abi_hdr)))
+               return -EFAULT;
+@@ -613,7 +621,8 @@ static int _sof_ipc4_bytes_ext_get(struc
+       if (data_size > size)
+               return -ENOSPC;
+-      header.numid = scontrol->comp_id;
++      /* Set header id and length */
++      header.numid = SOF_CTRL_CMD_BINARY;
+       header.length = data_size;
+       if (copy_to_user(tlvd, &header, sizeof(struct snd_ctl_tlv)))
diff --git a/queue-6.12/asoc-sof-ipc4-pcm-delay-reporting-is-only-supported-for-playback-direction.patch b/queue-6.12/asoc-sof-ipc4-pcm-delay-reporting-is-only-supported-for-playback-direction.patch
new file mode 100644 (file)
index 0000000..2a99985
--- /dev/null
@@ -0,0 +1,39 @@
+From 98db16f314b3a0d6e5acd94708ea69751436467f Mon Sep 17 00:00:00 2001
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Date: Fri, 9 May 2025 11:59:51 +0300
+Subject: ASoC: SOF: ipc4-pcm: Delay reporting is only supported for playback direction
+
+From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+
+commit 98db16f314b3a0d6e5acd94708ea69751436467f upstream.
+
+The firmware does not provide any information for capture streams via the
+shared pipeline registers.
+
+To avoid reporting invalid delay value for capture streams to user space
+we need to disable it.
+
+Fixes: af74dbd0dbcf ("ASoC: SOF: ipc4-pcm: allocate time info for pcm delay feature")
+Cc: stable@vger.kernel.org
+Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
+Link: https://patch.msgid.link/20250509085951.15696-1-peter.ujfalusi@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/sof/ipc4-pcm.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/sound/soc/sof/ipc4-pcm.c
++++ b/sound/soc/sof/ipc4-pcm.c
+@@ -794,7 +794,8 @@ static int sof_ipc4_pcm_setup(struct snd
+               spcm->stream[stream].private = stream_priv;
+-              if (!support_info)
++              /* Delay reporting is only supported on playback */
++              if (!support_info || stream == SNDRV_PCM_STREAM_CAPTURE)
+                       continue;
+               time_info = kzalloc(sizeof(*time_info), GFP_KERNEL);
diff --git a/queue-6.12/asoc-sof-topology-connect-dai-to-a-single-dai-link.patch b/queue-6.12/asoc-sof-topology-connect-dai-to-a-single-dai-link.patch
new file mode 100644 (file)
index 0000000..4684128
--- /dev/null
@@ -0,0 +1,70 @@
+From 6052f05254b4fe7b16bbd8224779af52fba98b71 Mon Sep 17 00:00:00 2001
+From: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+Date: Fri, 9 May 2025 11:53:18 +0300
+Subject: ASoc: SOF: topology: connect DAI to a single DAI link
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+
+commit 6052f05254b4fe7b16bbd8224779af52fba98b71 upstream.
+
+The partial matching of DAI widget to link names, can cause problems if
+one of the widget names is a substring of another. E.g. with names
+"Foo1" and Foo10", it's not possible to correctly link up "Foo1".
+
+Modify the logic so that if multiple DAI links match the widget stream
+name, prioritize a full match if one is found.
+
+Fixes: fe88788779fc ("ASoC: SOF: topology: Use partial match for connecting DAI link and DAI widget")
+Link: https://github.com/thesofproject/linux/issues/5308
+Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
+Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
+Link: https://patch.msgid.link/20250509085318.13936-1-peter.ujfalusi@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/soc/sof/topology.c |   18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+--- a/sound/soc/sof/topology.c
++++ b/sound/soc/sof/topology.c
+@@ -1059,7 +1059,7 @@ static int sof_connect_dai_widget(struct
+                                 struct snd_sof_dai *dai)
+ {
+       struct snd_soc_card *card = scomp->card;
+-      struct snd_soc_pcm_runtime *rtd;
++      struct snd_soc_pcm_runtime *rtd, *full, *partial;
+       struct snd_soc_dai *cpu_dai;
+       int stream;
+       int i;
+@@ -1076,12 +1076,22 @@ static int sof_connect_dai_widget(struct
+       else
+               goto end;
++      full = NULL;
++      partial = NULL;
+       list_for_each_entry(rtd, &card->rtd_list, list) {
+               /* does stream match DAI link ? */
+-              if (!rtd->dai_link->stream_name ||
+-                  !strstr(rtd->dai_link->stream_name, w->sname))
+-                      continue;
++              if (rtd->dai_link->stream_name) {
++                      if (!strcmp(rtd->dai_link->stream_name, w->sname)) {
++                              full = rtd;
++                              break;
++                      } else if (strstr(rtd->dai_link->stream_name, w->sname)) {
++                              partial = rtd;
++                      }
++              }
++      }
++      rtd = full ? full : partial;
++      if (rtd) {
+               for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
+                       /*
+                        * Please create DAI widget in the right order
diff --git a/queue-6.12/can-kvaser_pciefd-continue-parsing-dma-buf-after-dropped-rx.patch b/queue-6.12/can-kvaser_pciefd-continue-parsing-dma-buf-after-dropped-rx.patch
new file mode 100644 (file)
index 0000000..aada5ad
--- /dev/null
@@ -0,0 +1,62 @@
+From 6d820b81c4dc4a4023e45c3cd6707a07dd838649 Mon Sep 17 00:00:00 2001
+From: Axel Forsman <axfo@kvaser.com>
+Date: Tue, 20 May 2025 13:43:32 +0200
+Subject: can: kvaser_pciefd: Continue parsing DMA buf after dropped RX
+
+From: Axel Forsman <axfo@kvaser.com>
+
+commit 6d820b81c4dc4a4023e45c3cd6707a07dd838649 upstream.
+
+Going bus-off on a channel doing RX could result in dropped packets.
+
+As netif_running() gets cleared before the channel abort procedure,
+the handling of any last RDATA packets would see netif_rx() return
+non-zero to signal a dropped packet. kvaser_pciefd_read_buffer() dealt
+with this "error" by breaking out of processing the remaining DMA RX
+buffer.
+
+Only return an error from kvaser_pciefd_read_buffer() due to packet
+corruption, otherwise handle it internally.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Axel Forsman <axfo@kvaser.com>
+Tested-by: Jimmy Assarsson <extja@kvaser.com>
+Reviewed-by: Jimmy Assarsson <extja@kvaser.com>
+Link: https://patch.msgid.link/20250520114332.8961-4-axfo@kvaser.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/can/kvaser_pciefd.c |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -1200,7 +1200,7 @@ static int kvaser_pciefd_handle_data_pac
+               skb = alloc_canfd_skb(priv->dev, &cf);
+               if (!skb) {
+                       priv->dev->stats.rx_dropped++;
+-                      return -ENOMEM;
++                      return 0;
+               }
+               cf->len = can_fd_dlc2len(dlc);
+@@ -1212,7 +1212,7 @@ static int kvaser_pciefd_handle_data_pac
+               skb = alloc_can_skb(priv->dev, (struct can_frame **)&cf);
+               if (!skb) {
+                       priv->dev->stats.rx_dropped++;
+-                      return -ENOMEM;
++                      return 0;
+               }
+               can_frame_set_cc_len((struct can_frame *)cf, dlc, priv->ctrlmode);
+       }
+@@ -1230,7 +1230,9 @@ static int kvaser_pciefd_handle_data_pac
+       priv->dev->stats.rx_packets++;
+       kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
+-      return netif_rx(skb);
++      netif_rx(skb);
++
++      return 0;
+ }
+ static void kvaser_pciefd_change_state(struct kvaser_pciefd_can *can,
diff --git a/queue-6.12/can-kvaser_pciefd-fix-echo_skb-race.patch b/queue-6.12/can-kvaser_pciefd-fix-echo_skb-race.patch
new file mode 100644 (file)
index 0000000..87c58df
--- /dev/null
@@ -0,0 +1,237 @@
+From 8256e0ca601051933e9395746817f3801fa9a6bf Mon Sep 17 00:00:00 2001
+From: Axel Forsman <axfo@kvaser.com>
+Date: Tue, 20 May 2025 13:43:31 +0200
+Subject: can: kvaser_pciefd: Fix echo_skb race
+
+From: Axel Forsman <axfo@kvaser.com>
+
+commit 8256e0ca601051933e9395746817f3801fa9a6bf upstream.
+
+The functions kvaser_pciefd_start_xmit() and
+kvaser_pciefd_handle_ack_packet() raced to stop/wake TX queues and
+get/put echo skbs, as kvaser_pciefd_can->echo_lock was only ever taken
+when transmitting and KCAN_TX_NR_PACKETS_CURRENT gets decremented
+prior to handling of ACKs. E.g., this caused the following error:
+
+    can_put_echo_skb: BUG! echo_skb 5 is occupied!
+
+Instead, use the synchronization helpers in netdev_queues.h. As those
+piggyback on BQL barriers, start updating in-flight packets and bytes
+counts as well.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Axel Forsman <axfo@kvaser.com>
+Tested-by: Jimmy Assarsson <extja@kvaser.com>
+Reviewed-by: Jimmy Assarsson <extja@kvaser.com>
+Link: https://patch.msgid.link/20250520114332.8961-3-axfo@kvaser.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/can/kvaser_pciefd.c |   93 +++++++++++++++++++++++++---------------
+ 1 file changed, 59 insertions(+), 34 deletions(-)
+
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -16,6 +16,7 @@
+ #include <linux/netdevice.h>
+ #include <linux/pci.h>
+ #include <linux/timer.h>
++#include <net/netdev_queues.h>
+ MODULE_LICENSE("Dual BSD/GPL");
+ MODULE_AUTHOR("Kvaser AB <support@kvaser.com>");
+@@ -410,10 +411,13 @@ struct kvaser_pciefd_can {
+       void __iomem *reg_base;
+       struct can_berr_counter bec;
+       u8 cmd_seq;
++      u8 tx_max_count;
++      u8 tx_idx;
++      u8 ack_idx;
+       int err_rep_cnt;
+-      int echo_idx;
++      unsigned int completed_tx_pkts;
++      unsigned int completed_tx_bytes;
+       spinlock_t lock; /* Locks sensitive registers (e.g. MODE) */
+-      spinlock_t echo_lock; /* Locks the message echo buffer */
+       struct timer_list bec_poll_timer;
+       struct completion start_comp, flush_comp;
+ };
+@@ -714,6 +718,9 @@ static int kvaser_pciefd_open(struct net
+       int ret;
+       struct kvaser_pciefd_can *can = netdev_priv(netdev);
++      can->tx_idx = 0;
++      can->ack_idx = 0;
++
+       ret = open_candev(netdev);
+       if (ret)
+               return ret;
+@@ -745,21 +752,26 @@ static int kvaser_pciefd_stop(struct net
+               del_timer(&can->bec_poll_timer);
+       }
+       can->can.state = CAN_STATE_STOPPED;
++      netdev_reset_queue(netdev);
+       close_candev(netdev);
+       return ret;
+ }
++static unsigned int kvaser_pciefd_tx_avail(const struct kvaser_pciefd_can *can)
++{
++      return can->tx_max_count - (READ_ONCE(can->tx_idx) - READ_ONCE(can->ack_idx));
++}
++
+ static int kvaser_pciefd_prepare_tx_packet(struct kvaser_pciefd_tx_packet *p,
+-                                         struct kvaser_pciefd_can *can,
++                                         struct can_priv *can, u8 seq,
+                                          struct sk_buff *skb)
+ {
+       struct canfd_frame *cf = (struct canfd_frame *)skb->data;
+       int packet_size;
+-      int seq = can->echo_idx;
+       memset(p, 0, sizeof(*p));
+-      if (can->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
++      if (can->ctrlmode & CAN_CTRLMODE_ONE_SHOT)
+               p->header[1] |= KVASER_PCIEFD_TPACKET_SMS;
+       if (cf->can_id & CAN_RTR_FLAG)
+@@ -782,7 +794,7 @@ static int kvaser_pciefd_prepare_tx_pack
+       } else {
+               p->header[1] |=
+                       FIELD_PREP(KVASER_PCIEFD_RPACKET_DLC_MASK,
+-                                 can_get_cc_dlc((struct can_frame *)cf, can->can.ctrlmode));
++                                 can_get_cc_dlc((struct can_frame *)cf, can->ctrlmode));
+       }
+       p->header[1] |= FIELD_PREP(KVASER_PCIEFD_PACKET_SEQ_MASK, seq);
+@@ -797,22 +809,24 @@ static netdev_tx_t kvaser_pciefd_start_x
+                                           struct net_device *netdev)
+ {
+       struct kvaser_pciefd_can *can = netdev_priv(netdev);
+-      unsigned long irq_flags;
+       struct kvaser_pciefd_tx_packet packet;
++      unsigned int seq = can->tx_idx & (can->can.echo_skb_max - 1);
++      unsigned int frame_len;
+       int nr_words;
+-      u8 count;
+       if (can_dev_dropped_skb(netdev, skb))
+               return NETDEV_TX_OK;
++      if (!netif_subqueue_maybe_stop(netdev, 0, kvaser_pciefd_tx_avail(can), 1, 1))
++              return NETDEV_TX_BUSY;
+-      nr_words = kvaser_pciefd_prepare_tx_packet(&packet, can, skb);
++      nr_words = kvaser_pciefd_prepare_tx_packet(&packet, &can->can, seq, skb);
+-      spin_lock_irqsave(&can->echo_lock, irq_flags);
+       /* Prepare and save echo skb in internal slot */
+-      can_put_echo_skb(skb, netdev, can->echo_idx, 0);
+-
+-      /* Move echo index to the next slot */
+-      can->echo_idx = (can->echo_idx + 1) % can->can.echo_skb_max;
++      WRITE_ONCE(can->can.echo_skb[seq], NULL);
++      frame_len = can_skb_get_frame_len(skb);
++      can_put_echo_skb(skb, netdev, seq, frame_len);
++      netdev_sent_queue(netdev, frame_len);
++      WRITE_ONCE(can->tx_idx, can->tx_idx + 1);
+       /* Write header to fifo */
+       iowrite32(packet.header[0],
+@@ -836,14 +850,7 @@ static netdev_tx_t kvaser_pciefd_start_x
+                            KVASER_PCIEFD_KCAN_FIFO_LAST_REG);
+       }
+-      count = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_CURRENT_MASK,
+-                        ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG));
+-      /* No room for a new message, stop the queue until at least one
+-       * successful transmit
+-       */
+-      if (count >= can->can.echo_skb_max || can->can.echo_skb[can->echo_idx])
+-              netif_stop_queue(netdev);
+-      spin_unlock_irqrestore(&can->echo_lock, irq_flags);
++      netif_subqueue_maybe_stop(netdev, 0, kvaser_pciefd_tx_avail(can), 1, 1);
+       return NETDEV_TX_OK;
+ }
+@@ -970,6 +977,8 @@ static int kvaser_pciefd_setup_can_ctrls
+               can->kv_pcie = pcie;
+               can->cmd_seq = 0;
+               can->err_rep_cnt = 0;
++              can->completed_tx_pkts = 0;
++              can->completed_tx_bytes = 0;
+               can->bec.txerr = 0;
+               can->bec.rxerr = 0;
+@@ -983,11 +992,10 @@ static int kvaser_pciefd_setup_can_ctrls
+               tx_nr_packets_max =
+                       FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_MAX_MASK,
+                                 ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG));
++              can->tx_max_count = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1);
+               can->can.clock.freq = pcie->freq;
+-              can->can.echo_skb_max = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1);
+-              can->echo_idx = 0;
+-              spin_lock_init(&can->echo_lock);
++              can->can.echo_skb_max = roundup_pow_of_two(can->tx_max_count);
+               spin_lock_init(&can->lock);
+               can->can.bittiming_const = &kvaser_pciefd_bittiming_const;
+@@ -1509,19 +1517,21 @@ static int kvaser_pciefd_handle_ack_pack
+               netdev_dbg(can->can.dev, "Packet was flushed\n");
+       } else {
+               int echo_idx = FIELD_GET(KVASER_PCIEFD_PACKET_SEQ_MASK, p->header[0]);
+-              int len;
+-              u8 count;
++              unsigned int len, frame_len = 0;
+               struct sk_buff *skb;
++              if (echo_idx != (can->ack_idx & (can->can.echo_skb_max - 1)))
++                      return 0;
+               skb = can->can.echo_skb[echo_idx];
+-              if (skb)
+-                      kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
+-              len = can_get_echo_skb(can->can.dev, echo_idx, NULL);
+-              count = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_CURRENT_MASK,
+-                                ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG));
++              if (!skb)
++                      return 0;
++              kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
++              len = can_get_echo_skb(can->can.dev, echo_idx, &frame_len);
+-              if (count < can->can.echo_skb_max && netif_queue_stopped(can->can.dev))
+-                      netif_wake_queue(can->can.dev);
++              /* Pairs with barrier in kvaser_pciefd_start_xmit() */
++              smp_store_release(&can->ack_idx, can->ack_idx + 1);
++              can->completed_tx_pkts++;
++              can->completed_tx_bytes += frame_len;
+               if (!one_shot_fail) {
+                       can->can.dev->stats.tx_bytes += len;
+@@ -1637,11 +1647,26 @@ static int kvaser_pciefd_read_buffer(str
+ {
+       int pos = 0;
+       int res = 0;
++      unsigned int i;
+       do {
+               res = kvaser_pciefd_read_packet(pcie, &pos, dma_buf);
+       } while (!res && pos > 0 && pos < KVASER_PCIEFD_DMA_SIZE);
++      /* Report ACKs in this buffer to BQL en masse for correct periods */
++      for (i = 0; i < pcie->nr_channels; ++i) {
++              struct kvaser_pciefd_can *can = pcie->can[i];
++
++              if (!can->completed_tx_pkts)
++                      continue;
++              netif_subqueue_completed_wake(can->can.dev, 0,
++                                            can->completed_tx_pkts,
++                                            can->completed_tx_bytes,
++                                            kvaser_pciefd_tx_avail(can), 1);
++              can->completed_tx_pkts = 0;
++              can->completed_tx_bytes = 0;
++      }
++
+       return res;
+ }
diff --git a/queue-6.12/llc-fix-data-loss-when-reading-from-a-socket-in-llc_ui_recvmsg.patch b/queue-6.12/llc-fix-data-loss-when-reading-from-a-socket-in-llc_ui_recvmsg.patch
new file mode 100644 (file)
index 0000000..dc581d2
--- /dev/null
@@ -0,0 +1,49 @@
+From 239af1970bcb039a1551d2c438d113df0010c149 Mon Sep 17 00:00:00 2001
+From: Ilia Gavrilov <Ilia.Gavrilov@infotecs.ru>
+Date: Thu, 15 May 2025 12:20:15 +0000
+Subject: llc: fix data loss when reading from a socket in llc_ui_recvmsg()
+
+From: Ilia Gavrilov <Ilia.Gavrilov@infotecs.ru>
+
+commit 239af1970bcb039a1551d2c438d113df0010c149 upstream.
+
+For SOCK_STREAM sockets, if user buffer size (len) is less
+than skb size (skb->len), the remaining data from skb
+will be lost after calling kfree_skb().
+
+To fix this, move the statement for partial reading
+above skb deletion.
+
+Found by InfoTeCS on behalf of Linux Verification Center (linuxtesting.org)
+
+Fixes: 30a584d944fb ("[LLX]: SOCK_DGRAM interface fixes")
+Cc: stable@vger.kernel.org
+Signed-off-by: Ilia Gavrilov <Ilia.Gavrilov@infotecs.ru>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/llc/af_llc.c |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/net/llc/af_llc.c
++++ b/net/llc/af_llc.c
+@@ -887,15 +887,15 @@ static int llc_ui_recvmsg(struct socket
+               if (sk->sk_type != SOCK_STREAM)
+                       goto copy_uaddr;
++              /* Partial read */
++              if (used + offset < skb_len)
++                      continue;
++
+               if (!(flags & MSG_PEEK)) {
+                       skb_unlink(skb, &sk->sk_receive_queue);
+                       kfree_skb(skb);
+                       *seq = 0;
+               }
+-
+-              /* Partial read */
+-              if (used + offset < skb_len)
+-                      continue;
+       } while (len > 0);
+ out:
diff --git a/queue-6.12/mmc-sdhci-of-dwcmshc-add-pd-workaround-on-rk3576.patch b/queue-6.12/mmc-sdhci-of-dwcmshc-add-pd-workaround-on-rk3576.patch
new file mode 100644 (file)
index 0000000..9f01197
--- /dev/null
@@ -0,0 +1,113 @@
+From 08f959759e1e6e9c4b898c51a7d387ac3480630b Mon Sep 17 00:00:00 2001
+From: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
+Date: Wed, 23 Apr 2025 09:53:32 +0200
+Subject: mmc: sdhci-of-dwcmshc: add PD workaround on RK3576
+
+From: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
+
+commit 08f959759e1e6e9c4b898c51a7d387ac3480630b upstream.
+
+RK3576's power domains have a peculiar design where the PD_NVM power
+domain, of which the sdhci controller is a part, seemingly does not have
+idempotent runtime disable/enable. The end effect is that if PD_NVM gets
+turned off by the generic power domain logic because all the devices
+depending on it are suspended, then the next time the sdhci device is
+unsuspended, it'll hang the SoC as soon as it tries accessing the CQHCI
+registers.
+
+RK3576's UFS support needed a new dev_pm_genpd_rpm_always_on function
+added to the generic power domains API to handle what appears to be a
+similar hardware design.
+
+Use this new function to ask for the same treatment in the sdhci
+controller by giving rk3576 its own platform data with its own postinit
+function. The benefit of doing this instead of marking the power domains
+always on in the power domain core is that we only do this if we know
+the platform we're running on actually uses the sdhci controller. For
+others, keeping PD_NVM always on would be a waste, as they won't run
+into this specific issue. The only other IP in PD_NVM that could be
+affected is FSPI0. If it gets a mainline driver, it will probably want
+to do the same thing.
+
+Acked-by: Adrian Hunter <adrian.hunter@intel.com>
+Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
+Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
+Fixes: cfee1b507758 ("pmdomain: rockchip: Add support for RK3576 SoC")
+Cc: <stable@vger.kernel.org> # v6.15+
+Link: https://lore.kernel.org/r/20250423-rk3576-emmc-fix-v3-1-0bf80e29967f@collabora.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/host/sdhci-of-dwcmshc.c |   40 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
++++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
+@@ -17,6 +17,7 @@
+ #include <linux/module.h>
+ #include <linux/of.h>
+ #include <linux/platform_device.h>
++#include <linux/pm_domain.h>
+ #include <linux/pm_runtime.h>
+ #include <linux/reset.h>
+ #include <linux/sizes.h>
+@@ -787,6 +788,29 @@ static void dwcmshc_rk35xx_postinit(stru
+       }
+ }
++static void dwcmshc_rk3576_postinit(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv)
++{
++      struct device *dev = mmc_dev(host->mmc);
++      int ret;
++
++      /*
++       * This works around the design of the RK3576's power domains, which
++       * makes the PD_NVM power domain, which the sdhci controller on the
++       * RK3576 is in, never come back the same way once it's run-time
++       * suspended once. This can happen during early kernel boot if no driver
++       * is using either PD_NVM or its child power domain PD_SDGMAC for a
++       * short moment, leading to it being turned off to save power. By
++       * keeping it on, sdhci suspending won't lead to PD_NVM becoming a
++       * candidate for getting turned off.
++       */
++      ret = dev_pm_genpd_rpm_always_on(dev, true);
++      if (ret && ret != -EOPNOTSUPP)
++              dev_warn(dev, "failed to set PD rpm always on, SoC may hang later: %pe\n",
++                       ERR_PTR(ret));
++
++      dwcmshc_rk35xx_postinit(host, dwc_priv);
++}
++
+ static int th1520_execute_tuning(struct sdhci_host *host, u32 opcode)
+ {
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+@@ -1218,6 +1242,18 @@ static const struct dwcmshc_pltfm_data s
+       .postinit = dwcmshc_rk35xx_postinit,
+ };
++static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk3576_pdata = {
++      .pdata = {
++              .ops = &sdhci_dwcmshc_rk35xx_ops,
++              .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
++                        SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
++              .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
++                         SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
++      },
++      .init = dwcmshc_rk35xx_init,
++      .postinit = dwcmshc_rk3576_postinit,
++};
++
+ static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = {
+       .pdata = {
+               .ops = &sdhci_dwcmshc_th1520_ops,
+@@ -1317,6 +1353,10 @@ static const struct of_device_id sdhci_d
+               .data = &sdhci_dwcmshc_rk35xx_pdata,
+       },
+       {
++              .compatible = "rockchip,rk3576-dwcmshc",
++              .data = &sdhci_dwcmshc_rk3576_pdata,
++      },
++      {
+               .compatible = "rockchip,rk3568-dwcmshc",
+               .data = &sdhci_dwcmshc_rk35xx_pdata,
+       },
diff --git a/queue-6.12/net-dsa-microchip-linearize-skb-for-tail-tagging-switches.patch b/queue-6.12/net-dsa-microchip-linearize-skb-for-tail-tagging-switches.patch
new file mode 100644 (file)
index 0000000..33e47b8
--- /dev/null
@@ -0,0 +1,93 @@
+From ba54bce747fa9e07896c1abd9b48545f7b4b31d2 Mon Sep 17 00:00:00 2001
+From: Jakob Unterwurzacher <jakobunt@gmail.com>
+Date: Thu, 15 May 2025 09:29:19 +0200
+Subject: net: dsa: microchip: linearize skb for tail-tagging switches
+
+From: Jakob Unterwurzacher <jakobunt@gmail.com>
+
+commit ba54bce747fa9e07896c1abd9b48545f7b4b31d2 upstream.
+
+The pointer arithmentic for accessing the tail tag only works
+for linear skbs.
+
+For nonlinear skbs, it reads uninitialized memory inside the
+skb headroom, essentially randomizing the tag. I have observed
+it gets set to 6 most of the time.
+
+Example where ksz9477_rcv thinks that the packet from port 1 comes from port 6
+(which does not exist for the ksz9896 that's in use), dropping the packet.
+Debug prints added by me (not included in this patch):
+
+       [  256.645337] ksz9477_rcv:323 tag0=6
+       [  256.645349] skb len=47 headroom=78 headlen=0 tailroom=0
+                      mac=(64,14) mac_len=14 net=(78,0) trans=78
+                      shinfo(txflags=0 nr_frags=1 gso(size=0 type=0 segs=0))
+                      csum(0x0 start=0 offset=0 ip_summed=0 complete_sw=0 valid=0 level=0)
+                      hash(0x0 sw=0 l4=0) proto=0x00f8 pkttype=1 iif=3
+                      priority=0x0 mark=0x0 alloc_cpu=0 vlan_all=0x0
+                      encapsulation=0 inner(proto=0x0000, mac=0, net=0, trans=0)
+       [  256.645377] dev name=end1 feat=0x0002e10200114bb3
+       [  256.645386] skb headroom: 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+       [  256.645395] skb headroom: 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+       [  256.645403] skb headroom: 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+       [  256.645411] skb headroom: 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+       [  256.645420] skb headroom: 00000040: ff ff ff ff ff ff 00 1c 19 f2 e2 db 08 06
+       [  256.645428] skb frag:     00000000: 00 01 08 00 06 04 00 01 00 1c 19 f2 e2 db 0a 02
+       [  256.645436] skb frag:     00000010: 00 83 00 00 00 00 00 00 0a 02 a0 2f 00 00 00 00
+       [  256.645444] skb frag:     00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
+       [  256.645452] ksz_common_rcv:92 dsa_conduit_find_user returned NULL
+
+Call skb_linearize before trying to access the tag.
+
+This patch fixes ksz9477_rcv which is used by the ksz9896 I have at
+hand, and also applies the same fix to ksz8795_rcv which seems to have
+the same problem.
+
+Signed-off-by: Jakob Unterwurzacher <jakob.unterwurzacher@cherry.de>
+CC: stable@vger.kernel.org
+Fixes: 016e43a26bab ("net: dsa: ksz: Add KSZ8795 tag code")
+Fixes: 8b8010fb7876 ("dsa: add support for Microchip KSZ tail tagging")
+Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
+Link: https://patch.msgid.link/20250515072920.2313014-1-jakob.unterwurzacher@cherry.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/dsa/tag_ksz.c |   19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+--- a/net/dsa/tag_ksz.c
++++ b/net/dsa/tag_ksz.c
+@@ -140,7 +140,12 @@ static struct sk_buff *ksz8795_xmit(stru
+ static struct sk_buff *ksz8795_rcv(struct sk_buff *skb, struct net_device *dev)
+ {
+-      u8 *tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN;
++      u8 *tag;
++
++      if (skb_linearize(skb))
++              return NULL;
++
++      tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN;
+       return ksz_common_rcv(skb, dev, tag[0] & KSZ8795_TAIL_TAG_EG_PORT_M,
+                             KSZ_EGRESS_TAG_LEN);
+@@ -311,10 +316,16 @@ static struct sk_buff *ksz9477_xmit(stru
+ static struct sk_buff *ksz9477_rcv(struct sk_buff *skb, struct net_device *dev)
+ {
+-      /* Tag decoding */
+-      u8 *tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN;
+-      unsigned int port = tag[0] & KSZ9477_TAIL_TAG_EG_PORT_M;
+       unsigned int len = KSZ_EGRESS_TAG_LEN;
++      unsigned int port;
++      u8 *tag;
++
++      if (skb_linearize(skb))
++              return NULL;
++
++      /* Tag decoding */
++      tag = skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN;
++      port = tag[0] & KSZ9477_TAIL_TAG_EG_PORT_M;
+       /* Extra 4-bytes PTP timestamp */
+       if (tag[0] & KSZ9477_PTP_TAG_INDICATION) {
diff --git a/queue-6.12/pmdomain-core-fix-error-checking-in-genpd_dev_pm_attach_by_id.patch b/queue-6.12/pmdomain-core-fix-error-checking-in-genpd_dev_pm_attach_by_id.patch
new file mode 100644 (file)
index 0000000..65cf5f1
--- /dev/null
@@ -0,0 +1,38 @@
+From 0f5757667ec0aaf2456c3b76fcf0c6c3ea3591fe Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <dan.carpenter@linaro.org>
+Date: Thu, 8 May 2025 09:29:23 +0300
+Subject: pmdomain: core: Fix error checking in genpd_dev_pm_attach_by_id()
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+commit 0f5757667ec0aaf2456c3b76fcf0c6c3ea3591fe upstream.
+
+The error checking for of_count_phandle_with_args() does not handle
+negative error codes correctly.  The problem is that "index" is a u32 so
+in the condition "if (index >= num_domains)" negative error codes stored
+in "num_domains" are type promoted to very high positive values and
+"index" is always going to be valid.
+
+Test for negative error codes first and then test if "index" is valid.
+
+Fixes: 3ccf3f0cd197 ("PM / Domains: Enable genpd_dev_pm_attach_by_id|name() for single PM domain")
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/aBxPQ8AI8N5v-7rL@stanley.mountain
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/pmdomain/core.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/pmdomain/core.c
++++ b/drivers/pmdomain/core.c
+@@ -3043,7 +3043,7 @@ struct device *genpd_dev_pm_attach_by_id
+       /* Verify that the index is within a valid range. */
+       num_domains = of_count_phandle_with_args(dev->of_node, "power-domains",
+                                                "#power-domain-cells");
+-      if (index >= num_domains)
++      if (num_domains < 0 || index >= num_domains)
+               return NULL;
+       /* Allocate and register device on the genpd bus. */
diff --git a/queue-6.12/pmdomain-renesas-rcar-remove-obsolete-nullify-checks.patch b/queue-6.12/pmdomain-renesas-rcar-remove-obsolete-nullify-checks.patch
new file mode 100644 (file)
index 0000000..52a12fe
--- /dev/null
@@ -0,0 +1,58 @@
+From 13a6d4265665201a795a2ff5a3e6e4d183fc9c33 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Mon, 28 Apr 2025 13:47:52 +0200
+Subject: pmdomain: renesas: rcar: Remove obsolete nullify checks
+
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+
+commit 13a6d4265665201a795a2ff5a3e6e4d183fc9c33 upstream.
+
+All nullify users and helpers were removed, but the R-Car SYSC drivers
+still checked for nullified domains.  Remove the obsolete checks.
+
+Fixes: c8d87704444a8ac7 ("pmdomain: renesas: rcar-sysc: Remove rcar_sysc_nullify() helper")
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/107f2bf9f13b29f0f623d2959a5347ec151fb089.1745840768.git.geert+renesas@glider.be
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/pmdomain/renesas/rcar-gen4-sysc.c | 5 -----
+ drivers/pmdomain/renesas/rcar-sysc.c      | 5 -----
+ 2 files changed, 10 deletions(-)
+
+diff --git a/drivers/pmdomain/renesas/rcar-gen4-sysc.c b/drivers/pmdomain/renesas/rcar-gen4-sysc.c
+index 66409cff2083..e001b5c25bed 100644
+--- a/drivers/pmdomain/renesas/rcar-gen4-sysc.c
++++ b/drivers/pmdomain/renesas/rcar-gen4-sysc.c
+@@ -338,11 +338,6 @@ static int __init rcar_gen4_sysc_pd_init(void)
+               struct rcar_gen4_sysc_pd *pd;
+               size_t n;
+-              if (!area->name) {
+-                      /* Skip NULLified area */
+-                      continue;
+-              }
+-
+               n = strlen(area->name) + 1;
+               pd = kzalloc(sizeof(*pd) + n, GFP_KERNEL);
+               if (!pd) {
+diff --git a/drivers/pmdomain/renesas/rcar-sysc.c b/drivers/pmdomain/renesas/rcar-sysc.c
+index dce1a6d37e80..047495f54e8a 100644
+--- a/drivers/pmdomain/renesas/rcar-sysc.c
++++ b/drivers/pmdomain/renesas/rcar-sysc.c
+@@ -396,11 +396,6 @@ static int __init rcar_sysc_pd_init(void)
+               struct rcar_sysc_pd *pd;
+               size_t n;
+-              if (!area->name) {
+-                      /* Skip NULLified area */
+-                      continue;
+-              }
+-
+               n = strlen(area->name) + 1;
+               pd = kzalloc(sizeof(*pd) + n, GFP_KERNEL);
+               if (!pd) {
+-- 
+2.49.0
+
index 02dd3f8e527eed1b78ff45a25c85892f67a45226..3455680c8c103eefbd41f9648c7bda43bae6f3a6 100644 (file)
@@ -578,3 +578,17 @@ padata-do-not-leak-refcount-in-reorder_work.patch
 can-slcan-allow-reception-of-short-error-messages.patch
 can-bcm-add-locking-for-bcm_op-runtime-updates.patch
 can-bcm-add-missing-rcu-read-protection-for-procfs-content.patch
+asoc-sof-ipc4-control-use-sof_ctrl_cmd_binary-as-numid-for-bytes_ext.patch
+asoc-sof-intel-hda-bus-use-pio-mode-on-ace2-platforms.patch
+asoc-sof-topology-connect-dai-to-a-single-dai-link.patch
+asoc-sof-ipc4-pcm-delay-reporting-is-only-supported-for-playback-direction.patch
+alsa-pcm-fix-race-of-buffer-access-at-pcm-oss-layer.patch
+alsa-hda-realtek-add-quirk-for-lenovo-yoga-pro-7-14asp10.patch
+llc-fix-data-loss-when-reading-from-a-socket-in-llc_ui_recvmsg.patch
+can-kvaser_pciefd-continue-parsing-dma-buf-after-dropped-rx.patch
+can-kvaser_pciefd-fix-echo_skb-race.patch
+net-dsa-microchip-linearize-skb-for-tail-tagging-switches.patch
+vmxnet3-update-mtu-after-device-quiesce.patch
+mmc-sdhci-of-dwcmshc-add-pd-workaround-on-rk3576.patch
+pmdomain-renesas-rcar-remove-obsolete-nullify-checks.patch
+pmdomain-core-fix-error-checking-in-genpd_dev_pm_attach_by_id.patch
diff --git a/queue-6.12/vmxnet3-update-mtu-after-device-quiesce.patch b/queue-6.12/vmxnet3-update-mtu-after-device-quiesce.patch
new file mode 100644 (file)
index 0000000..052e7c6
--- /dev/null
@@ -0,0 +1,59 @@
+From 43f0999af011fba646e015f0bb08b6c3002a0170 Mon Sep 17 00:00:00 2001
+From: Ronak Doshi <ronak.doshi@broadcom.com>
+Date: Thu, 15 May 2025 19:04:56 +0000
+Subject: vmxnet3: update MTU after device quiesce
+
+From: Ronak Doshi <ronak.doshi@broadcom.com>
+
+commit 43f0999af011fba646e015f0bb08b6c3002a0170 upstream.
+
+Currently, when device mtu is updated, vmxnet3 updates netdev mtu, quiesces
+the device and then reactivates it for the ESXi to know about the new mtu.
+So, technically the OS stack can start using the new mtu before ESXi knows
+about the new mtu.
+
+This can lead to issues for TSO packets which use mss as per the new mtu
+configured. This patch fixes this issue by moving the mtu write after
+device quiesce.
+
+Cc: stable@vger.kernel.org
+Fixes: d1a890fa37f2 ("net: VMware virtual Ethernet NIC driver: vmxnet3")
+Signed-off-by: Ronak Doshi <ronak.doshi@broadcom.com>
+Acked-by: Guolin Yang <guolin.yang@broadcom.com>
+Changes v1-> v2:
+  Moved MTU write after destroy of rx rings
+Link: https://patch.msgid.link/20250515190457.8597-1-ronak.doshi@broadcom.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/vmxnet3/vmxnet3_drv.c |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/vmxnet3/vmxnet3_drv.c
++++ b/drivers/net/vmxnet3/vmxnet3_drv.c
+@@ -3599,8 +3599,6 @@ vmxnet3_change_mtu(struct net_device *ne
+       struct vmxnet3_adapter *adapter = netdev_priv(netdev);
+       int err = 0;
+-      WRITE_ONCE(netdev->mtu, new_mtu);
+-
+       /*
+        * Reset_work may be in the middle of resetting the device, wait for its
+        * completion.
+@@ -3614,6 +3612,7 @@ vmxnet3_change_mtu(struct net_device *ne
+               /* we need to re-create the rx queue based on the new mtu */
+               vmxnet3_rq_destroy_all(adapter);
++              WRITE_ONCE(netdev->mtu, new_mtu);
+               vmxnet3_adjust_rx_ring_size(adapter);
+               err = vmxnet3_rq_create_all(adapter);
+               if (err) {
+@@ -3630,6 +3629,8 @@ vmxnet3_change_mtu(struct net_device *ne
+                                  "Closing it\n", err);
+                       goto out;
+               }
++      } else {
++              WRITE_ONCE(netdev->mtu, new_mtu);
+       }
+ out: