]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 8 Jan 2024 12:30:35 +0000 (13:30 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 8 Jan 2024 12:30:35 +0000 (13:30 +0100)
added patches:
alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch
alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch
alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch
alsa-hda-tas2781-do-not-use-regcache.patch
alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch
alsa-hda-tas2781-remove-sound-controls-in-unbind.patch
cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch
cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch
drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch
drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch
kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch
mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch
revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch

14 files changed:
queue-6.6/alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch [new file with mode: 0644]
queue-6.6/alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch [new file with mode: 0644]
queue-6.6/alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch [new file with mode: 0644]
queue-6.6/alsa-hda-tas2781-do-not-use-regcache.patch [new file with mode: 0644]
queue-6.6/alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch [new file with mode: 0644]
queue-6.6/alsa-hda-tas2781-remove-sound-controls-in-unbind.patch [new file with mode: 0644]
queue-6.6/cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch [new file with mode: 0644]
queue-6.6/cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch [new file with mode: 0644]
queue-6.6/drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch [new file with mode: 0644]
queue-6.6/drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch [new file with mode: 0644]
queue-6.6/kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch [new file with mode: 0644]
queue-6.6/mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch [new file with mode: 0644]
queue-6.6/revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch [new file with mode: 0644]
queue-6.6/series

diff --git a/queue-6.6/alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch b/queue-6.6/alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch
new file mode 100644 (file)
index 0000000..27e290d
--- /dev/null
@@ -0,0 +1,34 @@
+From 13a5b21197587a3d9cac9e1a00de9b91526a55e4 Mon Sep 17 00:00:00 2001
+From: Aabish Malik <aabishmalik3337@gmail.com>
+Date: Fri, 29 Dec 2023 22:33:54 +0530
+Subject: ALSA: hda/realtek: enable SND_PCI_QUIRK for hp pavilion 14-ec1xxx series
+
+From: Aabish Malik <aabishmalik3337@gmail.com>
+
+commit 13a5b21197587a3d9cac9e1a00de9b91526a55e4 upstream.
+
+The HP Pavilion 14 ec1xxx series uses the HP mainboard 8A0F with the
+ALC287 codec.
+The mute led can be enabled using the already existing
+ALC287_FIXUP_HP_GPIO_LED quirk.
+Tested on an HP Pavilion ec1003AU
+
+Signed-off-by: Aabish Malik <aabishmalik3337@gmail.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20231229170352.742261-3-aabishmalik3337@gmail.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
+@@ -9791,6 +9791,7 @@ static const struct snd_pci_quirk alc269
+       SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
++      SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
+       SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
+       SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
diff --git a/queue-6.6/alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch b/queue-6.6/alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch
new file mode 100644 (file)
index 0000000..5ab3825
--- /dev/null
@@ -0,0 +1,32 @@
+From b6ce6e6c79e4ec650887f1fe391a70e54972001a Mon Sep 17 00:00:00 2001
+From: Siddhesh Dharme <siddheshdharme18@gmail.com>
+Date: Thu, 4 Jan 2024 11:37:36 +0530
+Subject: ALSA: hda/realtek: Fix mute and mic-mute LEDs for HP ProBook 440 G6
+
+From: Siddhesh Dharme <siddheshdharme18@gmail.com>
+
+commit b6ce6e6c79e4ec650887f1fe391a70e54972001a upstream.
+
+LEDs in 'HP ProBook 440 G6' laptop are controlled by ALC236 codec.
+Enable already existing quirk 'ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF'
+to fix mute and mic-mute LEDs.
+
+Signed-off-by: Siddhesh Dharme <siddheshdharme18@gmail.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20240104060736.5149-1-siddheshdharme18@gmail.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
+@@ -9709,6 +9709,7 @@ static const struct snd_pci_quirk alc269
+       SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
+       SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
+       SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
++      SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
+       SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
+       SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
diff --git a/queue-6.6/alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch b/queue-6.6/alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch
new file mode 100644 (file)
index 0000000..e67f526
--- /dev/null
@@ -0,0 +1,36 @@
+From 18a434f32fa61b3fda8ddcd9a63d5274569c6a41 Mon Sep 17 00:00:00 2001
+From: Andy Chi <andy.chi@canonical.com>
+Date: Tue, 2 Jan 2024 10:49:15 +0800
+Subject: ALSA: hda/realtek: fix mute/micmute LEDs for a HP ZBook
+
+From: Andy Chi <andy.chi@canonical.com>
+
+commit 18a434f32fa61b3fda8ddcd9a63d5274569c6a41 upstream.
+
+There is a HP ZBook which using ALC236 codec and need the
+ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF quirk to make mute LED
+and micmute LED work.
+
+[ confirmed that the new entries are for new models that have no
+  proper name, so the strings are left as "HP" which will be updated
+  eventually later -- tiwai ]
+
+Signed-off-by: Andy Chi <andy.chi@canonical.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20240102024916.19093-1-andy.chi@canonical.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
+@@ -9836,6 +9836,7 @@ static const struct snd_pci_quirk alc269
+       SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
++      SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
diff --git a/queue-6.6/alsa-hda-tas2781-do-not-use-regcache.patch b/queue-6.6/alsa-hda-tas2781-do-not-use-regcache.patch
new file mode 100644 (file)
index 0000000..ba39f18
--- /dev/null
@@ -0,0 +1,106 @@
+From 6dad45f4d28977bd1948973107cf325d431e5b7e Mon Sep 17 00:00:00 2001
+From: Gergo Koteles <soyer@irl.hu>
+Date: Fri, 22 Dec 2023 00:48:56 +0100
+Subject: ALSA: hda/tas2781: do not use regcache
+
+From: Gergo Koteles <soyer@irl.hu>
+
+commit 6dad45f4d28977bd1948973107cf325d431e5b7e upstream.
+
+There are two problems with using regcache in this module.
+
+The amplifier has 3 addressing levels (BOOK, PAGE, REG). The firmware
+contains blocks that must be written to BOOK 0x8C. The regcache doesn't
+know anything about BOOK, so regcache_sync writes invalid values to the
+actual BOOK.
+
+The module handles 2 or more separate amplifiers. The amplifiers have
+different register values, and the module uses only one regmap/regcache
+for all the amplifiers. The regcache_sync only writes the last amplifier
+used.
+
+The module successfully restores all the written register values (RC
+profile, program, configuration, calibration) without regcache.
+
+Remove regcache functions and set regmap cache_type to REGCACHE_NONE.
+
+Link: https://lore.kernel.org/r/21a183b5a08cb23b193af78d4b1114cc59419272.1701906455.git.soyer@irl.hu/
+
+Fixes: 5be27f1e3ec9 ("ALSA: hda/tas2781: Add tas2781 HDA driver")
+Acked-by: Mark Brown <broonie@kernel.org>
+CC: stable@vger.kernel.org
+Signed-off-by: Gergo Koteles <soyer@irl.hu>
+Link: https://lore.kernel.org/r/491aeed0e2eecc3b704ec856f815db21bad3ba0e.1703202126.git.soyer@irl.hu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/tas2781_hda_i2c.c   |   17 +----------------
+ sound/soc/codecs/tas2781-comlib.c |    2 +-
+ 2 files changed, 2 insertions(+), 17 deletions(-)
+
+--- a/sound/pci/hda/tas2781_hda_i2c.c
++++ b/sound/pci/hda/tas2781_hda_i2c.c
+@@ -717,8 +717,6 @@ static int tas2781_runtime_suspend(struc
+               tas_priv->tasdevice[i].cur_conf = -1;
+       }
+-      regcache_cache_only(tas_priv->regmap, true);
+-      regcache_mark_dirty(tas_priv->regmap);
+       mutex_unlock(&tas_priv->codec_lock);
+@@ -730,20 +728,11 @@ static int tas2781_runtime_resume(struct
+       struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
+       unsigned long calib_data_sz =
+               tas_priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE;
+-      int ret;
+       dev_dbg(tas_priv->dev, "Runtime Resume\n");
+       mutex_lock(&tas_priv->codec_lock);
+-      regcache_cache_only(tas_priv->regmap, false);
+-      ret = regcache_sync(tas_priv->regmap);
+-      if (ret) {
+-              dev_err(tas_priv->dev,
+-                      "Failed to restore register cache: %d\n", ret);
+-              goto out;
+-      }
+-
+       tasdevice_prmg_load(tas_priv, tas_priv->cur_prog);
+       /* If calibrated data occurs error, dsp will still works with default
+@@ -752,10 +741,9 @@ static int tas2781_runtime_resume(struct
+       if (tas_priv->cali_data.total_sz > calib_data_sz)
+               tas2781_apply_calib(tas_priv);
+-out:
+       mutex_unlock(&tas_priv->codec_lock);
+-      return ret;
++      return 0;
+ }
+ static int tas2781_system_suspend(struct device *dev)
+@@ -770,10 +758,7 @@ static int tas2781_system_suspend(struct
+               return ret;
+       /* Shutdown chip before system suspend */
+-      regcache_cache_only(tas_priv->regmap, false);
+       tasdevice_tuning_switch(tas_priv, 1);
+-      regcache_cache_only(tas_priv->regmap, true);
+-      regcache_mark_dirty(tas_priv->regmap);
+       /*
+        * Reset GPIO may be shared, so cannot reset here.
+--- a/sound/soc/codecs/tas2781-comlib.c
++++ b/sound/soc/codecs/tas2781-comlib.c
+@@ -39,7 +39,7 @@ static const struct regmap_range_cfg tas
+ static const struct regmap_config tasdevice_regmap = {
+       .reg_bits = 8,
+       .val_bits = 8,
+-      .cache_type = REGCACHE_RBTREE,
++      .cache_type = REGCACHE_NONE,
+       .ranges = tasdevice_ranges,
+       .num_ranges = ARRAY_SIZE(tasdevice_ranges),
+       .max_register = 256 * 128,
diff --git a/queue-6.6/alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch b/queue-6.6/alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch
new file mode 100644 (file)
index 0000000..e9cb239
--- /dev/null
@@ -0,0 +1,65 @@
+From e7aa105657f7f62f54a493480588895cc8a9a1a7 Mon Sep 17 00:00:00 2001
+From: Gergo Koteles <soyer@irl.hu>
+Date: Fri, 22 Dec 2023 01:34:47 +0100
+Subject: ALSA: hda/tas2781: move set_drv_data outside tasdevice_init
+
+From: Gergo Koteles <soyer@irl.hu>
+
+commit e7aa105657f7f62f54a493480588895cc8a9a1a7 upstream.
+
+allow driver specific driver data in tas2781-hda-i2c and tas2781-i2c
+
+Fixes: ef3bcde75d06 ("ASoC: tas2781: Add tas2781 driver")
+CC: stable@vger.kernel.org
+Signed-off-by: Gergo Koteles <soyer@irl.hu>
+Link: https://lore.kernel.org/r/1398bd8bf3e935b1595a99128320e4a1913e210a.1703204848.git.soyer@irl.hu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/tas2781_hda_i2c.c   | 2 ++
+ sound/soc/codecs/tas2781-comlib.c | 2 --
+ sound/soc/codecs/tas2781-i2c.c    | 2 ++
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/pci/hda/tas2781_hda_i2c.c b/sound/pci/hda/tas2781_hda_i2c.c
+index 54d135405788..6d11bced78f0 100644
+--- a/sound/pci/hda/tas2781_hda_i2c.c
++++ b/sound/pci/hda/tas2781_hda_i2c.c
+@@ -659,6 +659,8 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt)
+       if (!tas_priv)
+               return -ENOMEM;
++      dev_set_drvdata(&clt->dev, tas_priv);
++
+       tas_priv->irq_info.irq = clt->irq;
+       ret = tas2781_read_acpi(tas_priv, device_name);
+       if (ret)
+diff --git a/sound/soc/codecs/tas2781-comlib.c b/sound/soc/codecs/tas2781-comlib.c
+index 933cd008e9f5..00e35169ae49 100644
+--- a/sound/soc/codecs/tas2781-comlib.c
++++ b/sound/soc/codecs/tas2781-comlib.c
+@@ -316,8 +316,6 @@ int tasdevice_init(struct tasdevice_priv *tas_priv)
+               tas_priv->tasdevice[i].cur_conf = -1;
+       }
+-      dev_set_drvdata(tas_priv->dev, tas_priv);
+-
+       mutex_init(&tas_priv->codec_lock);
+ out:
+diff --git a/sound/soc/codecs/tas2781-i2c.c b/sound/soc/codecs/tas2781-i2c.c
+index 55cd5e3c23a5..917b1c15f71d 100644
+--- a/sound/soc/codecs/tas2781-i2c.c
++++ b/sound/soc/codecs/tas2781-i2c.c
+@@ -689,6 +689,8 @@ static int tasdevice_i2c_probe(struct i2c_client *i2c)
+       if (!tas_priv)
+               return -ENOMEM;
++      dev_set_drvdata(&i2c->dev, tas_priv);
++
+       if (ACPI_HANDLE(&i2c->dev)) {
+               acpi_id = acpi_match_device(i2c->dev.driver->acpi_match_table,
+                               &i2c->dev);
+-- 
+2.43.0
+
diff --git a/queue-6.6/alsa-hda-tas2781-remove-sound-controls-in-unbind.patch b/queue-6.6/alsa-hda-tas2781-remove-sound-controls-in-unbind.patch
new file mode 100644 (file)
index 0000000..b2a34a1
--- /dev/null
@@ -0,0 +1,474 @@
+From 4e7914eb1dae377b8e6de59c96b0653aacb47646 Mon Sep 17 00:00:00 2001
+From: Gergo Koteles <soyer@irl.hu>
+Date: Fri, 22 Dec 2023 01:34:48 +0100
+Subject: ALSA: hda/tas2781: remove sound controls in unbind
+
+From: Gergo Koteles <soyer@irl.hu>
+
+commit 4e7914eb1dae377b8e6de59c96b0653aacb47646 upstream.
+
+Remove sound controls in hda_unbind to make
+module loadable after module unload.
+
+Add a driver specific struct (tas2781_hda) to store
+the controls.
+
+This patch depends on patch:
+ALSA: hda/tas2781: do not use regcache
+
+Fixes: 5be27f1e3ec9 ("ALSA: hda/tas2781: Add tas2781 HDA driver")
+CC: stable@vger.kernel.org
+Signed-off-by: Gergo Koteles <soyer@irl.hu>
+Link: https://lore.kernel.org/r/362aa3e2f81b9259a3e5222f576bec5debfc5e88.1703204848.git.soyer@irl.hu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/tas2781_hda_i2c.c | 223 +++++++++++++++++++-------------
+ 1 file changed, 130 insertions(+), 93 deletions(-)
+
+diff --git a/sound/pci/hda/tas2781_hda_i2c.c b/sound/pci/hda/tas2781_hda_i2c.c
+index 6d11bced78f0..dfe281b57aa6 100644
+--- a/sound/pci/hda/tas2781_hda_i2c.c
++++ b/sound/pci/hda/tas2781_hda_i2c.c
+@@ -65,6 +65,15 @@ enum calib_data {
+       CALIB_MAX
+ };
++struct tas2781_hda {
++      struct device *dev;
++      struct tasdevice_priv *priv;
++      struct snd_kcontrol *dsp_prog_ctl;
++      struct snd_kcontrol *dsp_conf_ctl;
++      struct snd_kcontrol *prof_ctl;
++      struct snd_kcontrol *snd_ctls[3];
++};
++
+ static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)
+ {
+       struct tasdevice_priv *tas_priv = data;
+@@ -125,26 +134,26 @@ static int tas2781_read_acpi(struct tasdevice_priv *p, const char *hid)
+ static void tas2781_hda_playback_hook(struct device *dev, int action)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+-      dev_dbg(tas_priv->dev, "%s: action = %d\n", __func__, action);
++      dev_dbg(tas_hda->dev, "%s: action = %d\n", __func__, action);
+       switch (action) {
+       case HDA_GEN_PCM_ACT_OPEN:
+               pm_runtime_get_sync(dev);
+-              mutex_lock(&tas_priv->codec_lock);
+-              tasdevice_tuning_switch(tas_priv, 0);
+-              mutex_unlock(&tas_priv->codec_lock);
++              mutex_lock(&tas_hda->priv->codec_lock);
++              tasdevice_tuning_switch(tas_hda->priv, 0);
++              mutex_unlock(&tas_hda->priv->codec_lock);
+               break;
+       case HDA_GEN_PCM_ACT_CLOSE:
+-              mutex_lock(&tas_priv->codec_lock);
+-              tasdevice_tuning_switch(tas_priv, 1);
+-              mutex_unlock(&tas_priv->codec_lock);
++              mutex_lock(&tas_hda->priv->codec_lock);
++              tasdevice_tuning_switch(tas_hda->priv, 1);
++              mutex_unlock(&tas_hda->priv->codec_lock);
+               pm_runtime_mark_last_busy(dev);
+               pm_runtime_put_autosuspend(dev);
+               break;
+       default:
+-              dev_dbg(tas_priv->dev, "Playback action not supported: %d\n",
++              dev_dbg(tas_hda->dev, "Playback action not supported: %d\n",
+                       action);
+               break;
+       }
+@@ -477,9 +486,28 @@ static int tas2781_save_calibration(struct tasdevice_priv *tas_priv)
+       return 0;
+ }
++static void tas2781_hda_remove_controls(struct tas2781_hda *tas_hda)
++{
++      struct hda_codec *codec = tas_hda->priv->codec;
++
++      if (tas_hda->dsp_prog_ctl)
++              snd_ctl_remove(codec->card, tas_hda->dsp_prog_ctl);
++
++      if (tas_hda->dsp_conf_ctl)
++              snd_ctl_remove(codec->card, tas_hda->dsp_conf_ctl);
++
++      for (int i = ARRAY_SIZE(tas_hda->snd_ctls) - 1; i >= 0; i--)
++              if (tas_hda->snd_ctls[i])
++                      snd_ctl_remove(codec->card, tas_hda->snd_ctls[i]);
++
++      if (tas_hda->prof_ctl)
++              snd_ctl_remove(codec->card, tas_hda->prof_ctl);
++}
++
+ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
+ {
+       struct tasdevice_priv *tas_priv = context;
++      struct tas2781_hda *tas_hda = dev_get_drvdata(tas_priv->dev);
+       struct hda_codec *codec = tas_priv->codec;
+       int i, ret;
+@@ -490,8 +518,8 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
+       if (ret)
+               goto out;
+-      ret = snd_ctl_add(codec->card,
+-              snd_ctl_new1(&tas2781_prof_ctrl, tas_priv));
++      tas_hda->prof_ctl = snd_ctl_new1(&tas2781_prof_ctrl, tas_priv);
++      ret = snd_ctl_add(codec->card, tas_hda->prof_ctl);
+       if (ret) {
+               dev_err(tas_priv->dev,
+                       "Failed to add KControl %s = %d\n",
+@@ -500,8 +528,9 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
+       }
+       for (i = 0; i < ARRAY_SIZE(tas2781_snd_controls); i++) {
+-              ret = snd_ctl_add(codec->card,
+-                      snd_ctl_new1(&tas2781_snd_controls[i], tas_priv));
++              tas_hda->snd_ctls[i] = snd_ctl_new1(&tas2781_snd_controls[i],
++                      tas_priv);
++              ret = snd_ctl_add(codec->card, tas_hda->snd_ctls[i]);
+               if (ret) {
+                       dev_err(tas_priv->dev,
+                               "Failed to add KControl %s = %d\n",
+@@ -523,8 +552,9 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
+               goto out;
+       }
+-      ret = snd_ctl_add(codec->card,
+-              snd_ctl_new1(&tas2781_dsp_prog_ctrl, tas_priv));
++      tas_hda->dsp_prog_ctl = snd_ctl_new1(&tas2781_dsp_prog_ctrl,
++              tas_priv);
++      ret = snd_ctl_add(codec->card, tas_hda->dsp_prog_ctl);
+       if (ret) {
+               dev_err(tas_priv->dev,
+                       "Failed to add KControl %s = %d\n",
+@@ -532,8 +562,9 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
+               goto out;
+       }
+-      ret = snd_ctl_add(codec->card,
+-              snd_ctl_new1(&tas2781_dsp_conf_ctrl, tas_priv));
++      tas_hda->dsp_conf_ctl = snd_ctl_new1(&tas2781_dsp_conf_ctrl,
++              tas_priv);
++      ret = snd_ctl_add(codec->card, tas_hda->dsp_conf_ctl);
+       if (ret) {
+               dev_err(tas_priv->dev,
+                       "Failed to add KControl %s = %d\n",
+@@ -554,27 +585,27 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
+       tas2781_save_calibration(tas_priv);
+ out:
+-      mutex_unlock(&tas_priv->codec_lock);
++      mutex_unlock(&tas_hda->priv->codec_lock);
+       if (fmw)
+               release_firmware(fmw);
+-      pm_runtime_mark_last_busy(tas_priv->dev);
+-      pm_runtime_put_autosuspend(tas_priv->dev);
++      pm_runtime_mark_last_busy(tas_hda->dev);
++      pm_runtime_put_autosuspend(tas_hda->dev);
+ }
+ static int tas2781_hda_bind(struct device *dev, struct device *master,
+       void *master_data)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       struct hda_component *comps = master_data;
+       struct hda_codec *codec;
+       unsigned int subid;
+       int ret;
+-      if (!comps || tas_priv->index < 0 ||
+-              tas_priv->index >= HDA_MAX_COMPONENTS)
++      if (!comps || tas_hda->priv->index < 0 ||
++              tas_hda->priv->index >= HDA_MAX_COMPONENTS)
+               return -EINVAL;
+-      comps = &comps[tas_priv->index];
++      comps = &comps[tas_hda->priv->index];
+       if (comps->dev)
+               return -EBUSY;
+@@ -583,10 +614,10 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
+       switch (subid) {
+       case 0x17aa:
+-              tas_priv->catlog_id = LENOVO;
++              tas_hda->priv->catlog_id = LENOVO;
+               break;
+       default:
+-              tas_priv->catlog_id = OTHERS;
++              tas_hda->priv->catlog_id = OTHERS;
+               break;
+       }
+@@ -596,7 +627,7 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
+       strscpy(comps->name, dev_name(dev), sizeof(comps->name));
+-      ret = tascodec_init(tas_priv, codec, tasdev_fw_ready);
++      ret = tascodec_init(tas_hda->priv, codec, tasdev_fw_ready);
+       if (!ret)
+               comps->playback_hook = tas2781_hda_playback_hook;
+@@ -609,9 +640,9 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
+ static void tas2781_hda_unbind(struct device *dev,
+       struct device *master, void *master_data)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       struct hda_component *comps = master_data;
+-      comps = &comps[tas_priv->index];
++      comps = &comps[tas_hda->priv->index];
+       if (comps->dev == dev) {
+               comps->dev = NULL;
+@@ -619,10 +650,12 @@ static void tas2781_hda_unbind(struct device *dev,
+               comps->playback_hook = NULL;
+       }
+-      tasdevice_config_info_remove(tas_priv);
+-      tasdevice_dsp_remove(tas_priv);
++      tas2781_hda_remove_controls(tas_hda);
+-      tas_priv->fw_state = TASDEVICE_DSP_FW_PENDING;
++      tasdevice_config_info_remove(tas_hda->priv);
++      tasdevice_dsp_remove(tas_hda->priv);
++
++      tas_hda->priv->fw_state = TASDEVICE_DSP_FW_PENDING;
+ }
+ static const struct component_ops tas2781_hda_comp_ops = {
+@@ -632,21 +665,21 @@ static const struct component_ops tas2781_hda_comp_ops = {
+ static void tas2781_hda_remove(struct device *dev)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+-      pm_runtime_get_sync(tas_priv->dev);
+-      pm_runtime_disable(tas_priv->dev);
++      pm_runtime_get_sync(tas_hda->dev);
++      pm_runtime_disable(tas_hda->dev);
+-      component_del(tas_priv->dev, &tas2781_hda_comp_ops);
++      component_del(tas_hda->dev, &tas2781_hda_comp_ops);
+-      pm_runtime_put_noidle(tas_priv->dev);
++      pm_runtime_put_noidle(tas_hda->dev);
+-      tasdevice_remove(tas_priv);
++      tasdevice_remove(tas_hda->priv);
+ }
+ static int tas2781_hda_i2c_probe(struct i2c_client *clt)
+ {
+-      struct tasdevice_priv *tas_priv;
++      struct tas2781_hda *tas_hda;
+       const char *device_name;
+       int ret;
+@@ -655,37 +688,42 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt)
+       else
+               return -ENODEV;
+-      tas_priv = tasdevice_kzalloc(clt);
+-      if (!tas_priv)
++      tas_hda = devm_kzalloc(&clt->dev, sizeof(*tas_hda), GFP_KERNEL);
++      if (!tas_hda)
+               return -ENOMEM;
+-      dev_set_drvdata(&clt->dev, tas_priv);
++      dev_set_drvdata(&clt->dev, tas_hda);
++      tas_hda->dev = &clt->dev;
+-      tas_priv->irq_info.irq = clt->irq;
+-      ret = tas2781_read_acpi(tas_priv, device_name);
++      tas_hda->priv = tasdevice_kzalloc(clt);
++      if (!tas_hda->priv)
++              return -ENOMEM;
++
++      tas_hda->priv->irq_info.irq = clt->irq;
++      ret = tas2781_read_acpi(tas_hda->priv, device_name);
+       if (ret)
+-              return dev_err_probe(tas_priv->dev, ret,
++              return dev_err_probe(tas_hda->dev, ret,
+                       "Platform not supported\n");
+-      ret = tasdevice_init(tas_priv);
++      ret = tasdevice_init(tas_hda->priv);
+       if (ret)
+               goto err;
+-      pm_runtime_set_autosuspend_delay(tas_priv->dev, 3000);
+-      pm_runtime_use_autosuspend(tas_priv->dev);
+-      pm_runtime_mark_last_busy(tas_priv->dev);
+-      pm_runtime_set_active(tas_priv->dev);
+-      pm_runtime_get_noresume(tas_priv->dev);
+-      pm_runtime_enable(tas_priv->dev);
++      pm_runtime_set_autosuspend_delay(tas_hda->dev, 3000);
++      pm_runtime_use_autosuspend(tas_hda->dev);
++      pm_runtime_mark_last_busy(tas_hda->dev);
++      pm_runtime_set_active(tas_hda->dev);
++      pm_runtime_get_noresume(tas_hda->dev);
++      pm_runtime_enable(tas_hda->dev);
+-      pm_runtime_put_autosuspend(tas_priv->dev);
++      pm_runtime_put_autosuspend(tas_hda->dev);
+-      tas2781_reset(tas_priv);
++      tas2781_reset(tas_hda->priv);
+-      ret = component_add(tas_priv->dev, &tas2781_hda_comp_ops);
++      ret = component_add(tas_hda->dev, &tas2781_hda_comp_ops);
+       if (ret) {
+-              dev_err(tas_priv->dev, "Register component failed: %d\n", ret);
+-              pm_runtime_disable(tas_priv->dev);
++              dev_err(tas_hda->dev, "Register component failed: %d\n", ret);
++              pm_runtime_disable(tas_hda->dev);
+       }
+ err:
+@@ -701,66 +739,65 @@ static void tas2781_hda_i2c_remove(struct i2c_client *clt)
+ static int tas2781_runtime_suspend(struct device *dev)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       int i;
+-      dev_dbg(tas_priv->dev, "Runtime Suspend\n");
++      dev_dbg(tas_hda->dev, "Runtime Suspend\n");
+-      mutex_lock(&tas_priv->codec_lock);
++      mutex_lock(&tas_hda->priv->codec_lock);
+-      if (tas_priv->playback_started) {
+-              tasdevice_tuning_switch(tas_priv, 1);
+-              tas_priv->playback_started = false;
++      if (tas_hda->priv->playback_started) {
++              tasdevice_tuning_switch(tas_hda->priv, 1);
++              tas_hda->priv->playback_started = false;
+       }
+-      for (i = 0; i < tas_priv->ndev; i++) {
+-              tas_priv->tasdevice[i].cur_book = -1;
+-              tas_priv->tasdevice[i].cur_prog = -1;
+-              tas_priv->tasdevice[i].cur_conf = -1;
++      for (i = 0; i < tas_hda->priv->ndev; i++) {
++              tas_hda->priv->tasdevice[i].cur_book = -1;
++              tas_hda->priv->tasdevice[i].cur_prog = -1;
++              tas_hda->priv->tasdevice[i].cur_conf = -1;
+       }
+-
+-      mutex_unlock(&tas_priv->codec_lock);
++      mutex_unlock(&tas_hda->priv->codec_lock);
+       return 0;
+ }
+ static int tas2781_runtime_resume(struct device *dev)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       unsigned long calib_data_sz =
+-              tas_priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE;
++              tas_hda->priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE;
+-      dev_dbg(tas_priv->dev, "Runtime Resume\n");
++      dev_dbg(tas_hda->dev, "Runtime Resume\n");
+-      mutex_lock(&tas_priv->codec_lock);
++      mutex_lock(&tas_hda->priv->codec_lock);
+-      tasdevice_prmg_load(tas_priv, tas_priv->cur_prog);
++      tasdevice_prmg_load(tas_hda->priv, tas_hda->priv->cur_prog);
+       /* If calibrated data occurs error, dsp will still works with default
+        * calibrated data inside algo.
+        */
+-      if (tas_priv->cali_data.total_sz > calib_data_sz)
+-              tas2781_apply_calib(tas_priv);
++      if (tas_hda->priv->cali_data.total_sz > calib_data_sz)
++              tas2781_apply_calib(tas_hda->priv);
+-      mutex_unlock(&tas_priv->codec_lock);
++      mutex_unlock(&tas_hda->priv->codec_lock);
+       return 0;
+ }
+ static int tas2781_system_suspend(struct device *dev)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       int ret;
+-      dev_dbg(tas_priv->dev, "System Suspend\n");
++      dev_dbg(tas_hda->priv->dev, "System Suspend\n");
+       ret = pm_runtime_force_suspend(dev);
+       if (ret)
+               return ret;
+       /* Shutdown chip before system suspend */
+-      tasdevice_tuning_switch(tas_priv, 1);
++      tasdevice_tuning_switch(tas_hda->priv, 1);
+       /*
+        * Reset GPIO may be shared, so cannot reset here.
+@@ -771,33 +808,33 @@ static int tas2781_system_suspend(struct device *dev)
+ static int tas2781_system_resume(struct device *dev)
+ {
+-      struct tasdevice_priv *tas_priv = dev_get_drvdata(dev);
++      struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       unsigned long calib_data_sz =
+-              tas_priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE;
++              tas_hda->priv->ndev * TASDEVICE_SPEAKER_CALIBRATION_SIZE;
+       int i, ret;
+-      dev_dbg(tas_priv->dev, "System Resume\n");
++      dev_info(tas_hda->priv->dev, "System Resume\n");
+       ret = pm_runtime_force_resume(dev);
+       if (ret)
+               return ret;
+-      mutex_lock(&tas_priv->codec_lock);
++      mutex_lock(&tas_hda->priv->codec_lock);
+-      for (i = 0; i < tas_priv->ndev; i++) {
+-              tas_priv->tasdevice[i].cur_book = -1;
+-              tas_priv->tasdevice[i].cur_prog = -1;
+-              tas_priv->tasdevice[i].cur_conf = -1;
++      for (i = 0; i < tas_hda->priv->ndev; i++) {
++              tas_hda->priv->tasdevice[i].cur_book = -1;
++              tas_hda->priv->tasdevice[i].cur_prog = -1;
++              tas_hda->priv->tasdevice[i].cur_conf = -1;
+       }
+-      tas2781_reset(tas_priv);
+-      tasdevice_prmg_load(tas_priv, tas_priv->cur_prog);
++      tas2781_reset(tas_hda->priv);
++      tasdevice_prmg_load(tas_hda->priv, tas_hda->priv->cur_prog);
+       /* If calibrated data occurs error, dsp will still work with default
+        * calibrated data inside algo.
+        */
+-      if (tas_priv->cali_data.total_sz > calib_data_sz)
+-              tas2781_apply_calib(tas_priv);
+-      mutex_unlock(&tas_priv->codec_lock);
++      if (tas_hda->priv->cali_data.total_sz > calib_data_sz)
++              tas2781_apply_calib(tas_hda->priv);
++      mutex_unlock(&tas_hda->priv->codec_lock);
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch b/queue-6.6/cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch
new file mode 100644 (file)
index 0000000..c3f559b
--- /dev/null
@@ -0,0 +1,64 @@
+From 7257bcf3bdc785eabc4eef1f329a59815b032508 Mon Sep 17 00:00:00 2001
+From: Shyam Prasad N <sprasad@microsoft.com>
+Date: Fri, 29 Dec 2023 11:16:15 +0000
+Subject: cifs: cifs_chan_is_iface_active should be called with chan_lock held
+
+From: Shyam Prasad N <sprasad@microsoft.com>
+
+commit 7257bcf3bdc785eabc4eef1f329a59815b032508 upstream.
+
+cifs_chan_is_iface_active checks the channels of a session to see
+if the associated iface is active. This should always happen
+with chan_lock held. However, these two callers of this function
+were missing this locking.
+
+This change makes sure the function calls are protected with
+proper locking.
+
+Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary")
+Fixes: fa1d0508bdd4 ("cifs: account for primary channel in the interface list")
+Cc: stable@vger.kernel.org
+Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/client/connect.c |    7 +++++--
+ fs/smb/client/smb2ops.c |    7 ++++++-
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+--- a/fs/smb/client/connect.c
++++ b/fs/smb/client/connect.c
+@@ -209,10 +209,13 @@ cifs_mark_tcp_ses_conns_for_reconnect(st
+       spin_lock(&cifs_tcp_ses_lock);
+       list_for_each_entry_safe(ses, nses, &pserver->smb_ses_list, smb_ses_list) {
+               /* check if iface is still active */
+-              if (!cifs_chan_is_iface_active(ses, server))
++              spin_lock(&ses->chan_lock);
++              if (!cifs_chan_is_iface_active(ses, server)) {
++                      spin_unlock(&ses->chan_lock);
+                       cifs_chan_update_iface(ses, server);
++                      spin_lock(&ses->chan_lock);
++              }
+-              spin_lock(&ses->chan_lock);
+               if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server)) {
+                       spin_unlock(&ses->chan_lock);
+                       continue;
+--- a/fs/smb/client/smb2ops.c
++++ b/fs/smb/client/smb2ops.c
+@@ -782,9 +782,14 @@ SMB3_request_interfaces(const unsigned i
+               goto out;
+       /* check if iface is still active */
++      spin_lock(&ses->chan_lock);
+       pserver = ses->chans[0].server;
+-      if (pserver && !cifs_chan_is_iface_active(ses, pserver))
++      if (pserver && !cifs_chan_is_iface_active(ses, pserver)) {
++              spin_unlock(&ses->chan_lock);
+               cifs_chan_update_iface(ses, pserver);
++              spin_lock(&ses->chan_lock);
++      }
++      spin_unlock(&ses->chan_lock);
+ out:
+       kfree(out_buf);
diff --git a/queue-6.6/cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch b/queue-6.6/cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch
new file mode 100644 (file)
index 0000000..f91b0b7
--- /dev/null
@@ -0,0 +1,96 @@
+From 09eeb0723f219fbd96d8865bf9b935e03ee2ec22 Mon Sep 17 00:00:00 2001
+From: Shyam Prasad N <sprasad@microsoft.com>
+Date: Fri, 29 Dec 2023 11:16:16 +0000
+Subject: cifs: do not depend on release_iface for maintaining iface_list
+
+From: Shyam Prasad N <sprasad@microsoft.com>
+
+commit 09eeb0723f219fbd96d8865bf9b935e03ee2ec22 upstream.
+
+parse_server_interfaces should be in complete charge of maintaining
+the iface_list linked list. Today, iface entries are removed
+from the list only when the last refcount is dropped.
+i.e. in release_iface. However, this can result in undercounting
+of refcount if the server stops advertising interfaces (which
+Azure SMB server does).
+
+This change puts parse_server_interfaces in full charge of
+maintaining the iface_list. So if an empty list is returned
+by the server, the entries in the list will immediately be
+removed. This way, a following call to the same function will
+not find entries in the list.
+
+Fixes: aa45dadd34e4 ("cifs: change iface_list from array to sorted linked list")
+Cc: stable@vger.kernel.org
+Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/client/cifsglob.h |    1 -
+ fs/smb/client/smb2ops.c  |   27 +++++++++++++++++----------
+ 2 files changed, 17 insertions(+), 11 deletions(-)
+
+--- a/fs/smb/client/cifsglob.h
++++ b/fs/smb/client/cifsglob.h
+@@ -993,7 +993,6 @@ release_iface(struct kref *ref)
+       struct cifs_server_iface *iface = container_of(ref,
+                                                      struct cifs_server_iface,
+                                                      refcount);
+-      list_del_init(&iface->iface_head);
+       kfree(iface);
+ }
+--- a/fs/smb/client/smb2ops.c
++++ b/fs/smb/client/smb2ops.c
+@@ -593,16 +593,12 @@ parse_server_interfaces(struct network_i
+       }
+       /*
+-       * Go through iface_list and do kref_put to remove
+-       * any unused ifaces. ifaces in use will be removed
+-       * when the last user calls a kref_put on it
++       * Go through iface_list and mark them as inactive
+        */
+       list_for_each_entry_safe(iface, niface, &ses->iface_list,
+-                               iface_head) {
++                               iface_head)
+               iface->is_active = 0;
+-              kref_put(&iface->refcount, release_iface);
+-              ses->iface_count--;
+-      }
++
+       spin_unlock(&ses->iface_lock);
+       /*
+@@ -676,10 +672,7 @@ parse_server_interfaces(struct network_i
+                                        iface_head) {
+                       ret = iface_cmp(iface, &tmp_iface);
+                       if (!ret) {
+-                              /* just get a ref so that it doesn't get picked/freed */
+                               iface->is_active = 1;
+-                              kref_get(&iface->refcount);
+-                              ses->iface_count++;
+                               spin_unlock(&ses->iface_lock);
+                               goto next_iface;
+                       } else if (ret < 0) {
+@@ -746,6 +739,20 @@ next_iface:
+       }
+ out:
++      /*
++       * Go through the list again and put the inactive entries
++       */
++      spin_lock(&ses->iface_lock);
++      list_for_each_entry_safe(iface, niface, &ses->iface_list,
++                               iface_head) {
++              if (!iface->is_active) {
++                      list_del(&iface->iface_head);
++                      kref_put(&iface->refcount, release_iface);
++                      ses->iface_count--;
++              }
++      }
++      spin_unlock(&ses->iface_lock);
++
+       return rc;
+ }
diff --git a/queue-6.6/drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch b/queue-6.6/drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch
new file mode 100644 (file)
index 0000000..d9b7c11
--- /dev/null
@@ -0,0 +1,39 @@
+From 9cdef4f720376ef0fb0febce1ed2377c19e531f9 Mon Sep 17 00:00:00 2001
+From: Wayne Lin <wayne.lin@amd.com>
+Date: Mon, 4 Dec 2023 10:09:33 +0800
+Subject: drm/amd/display: pbn_div need be updated for hotplug event
+
+From: Wayne Lin <wayne.lin@amd.com>
+
+commit 9cdef4f720376ef0fb0febce1ed2377c19e531f9 upstream.
+
+link_rate sometime will be changed when DP MST connector hotplug, so
+pbn_div also need be updated; otherwise, it will mismatch with
+link_rate, causes no output in external monitor.
+
+This is a backport to 6.7 and older.
+
+Cc: stable@vger.kernel.org
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Reviewed-by: Jerry Zuo <jerry.zuo@amd.com>
+Acked-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
+Signed-off-by: Wade Wang <wade.wang@hp.com>
+Signed-off-by: Wayne Lin <wayne.lin@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -6868,8 +6868,7 @@ static int dm_encoder_helper_atomic_chec
+       if (IS_ERR(mst_state))
+               return PTR_ERR(mst_state);
+-      if (!mst_state->pbn_div)
+-              mst_state->pbn_div = dm_mst_get_pbn_divider(aconnector->mst_root->dc_link);
++      mst_state->pbn_div = dm_mst_get_pbn_divider(aconnector->mst_root->dc_link);
+       if (!state->duplicated) {
+               int max_bpc = conn_state->max_requested_bpc;
diff --git a/queue-6.6/drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch b/queue-6.6/drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch
new file mode 100644 (file)
index 0000000..09ad142
--- /dev/null
@@ -0,0 +1,116 @@
+From 11f9eb899ecc8c02b769cf8d2532ba12786a7af7 Mon Sep 17 00:00:00 2001
+From: Jocelyn Falempe <jfalempe@redhat.com>
+Date: Thu, 14 Dec 2023 17:38:06 +0100
+Subject: drm/mgag200: Fix gamma lut not initialized for G200ER, G200EV, G200SE
+
+From: Jocelyn Falempe <jfalempe@redhat.com>
+
+commit 11f9eb899ecc8c02b769cf8d2532ba12786a7af7 upstream.
+
+When mgag200 switched from simple KMS to regular atomic helpers,
+the initialization of the gamma settings was lost.
+This leads to a black screen, if the bios/uefi doesn't use the same
+pixel color depth.
+This has been fixed with commit ad81e23426a6 ("drm/mgag200: Fix gamma
+lut not initialized.") for most G200, but G200ER, G200EV, G200SE use
+their own version of crtc_helper_atomic_enable() and need to be fixed
+too.
+
+Fixes: 1baf9127c482 ("drm/mgag200: Replace simple-KMS with regular atomic helpers")
+Cc: <stable@vger.kernel.org> #v6.1+
+Reported-by: Roger Sewell <roger.sewell@cantab.net>
+Suggested-by: Roger Sewell <roger.sewell@cantab.net>
+Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
+Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20231214163849.359691-1-jfalempe@redhat.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/mgag200/mgag200_drv.h    |    5 +++++
+ drivers/gpu/drm/mgag200/mgag200_g200er.c |    5 +++++
+ drivers/gpu/drm/mgag200/mgag200_g200ev.c |    5 +++++
+ drivers/gpu/drm/mgag200/mgag200_g200se.c |    5 +++++
+ drivers/gpu/drm/mgag200/mgag200_mode.c   |   10 +++++-----
+ 5 files changed, 25 insertions(+), 5 deletions(-)
+
+--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
++++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
+@@ -392,6 +392,11 @@ void mgag200_primary_plane_helper_atomic
+       .destroy = drm_plane_cleanup, \
+       DRM_GEM_SHADOW_PLANE_FUNCS
++void mgag200_crtc_set_gamma_linear(struct mga_device *mdev, const struct drm_format_info *format);
++void mgag200_crtc_set_gamma(struct mga_device *mdev,
++                          const struct drm_format_info *format,
++                          struct drm_color_lut *lut);
++
+ enum drm_mode_status mgag200_crtc_helper_mode_valid(struct drm_crtc *crtc,
+                                                   const struct drm_display_mode *mode);
+ int mgag200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state);
+--- a/drivers/gpu/drm/mgag200/mgag200_g200er.c
++++ b/drivers/gpu/drm/mgag200/mgag200_g200er.c
+@@ -202,6 +202,11 @@ static void mgag200_g200er_crtc_helper_a
+       mgag200_g200er_reset_tagfifo(mdev);
++      if (crtc_state->gamma_lut)
++              mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data);
++      else
++              mgag200_crtc_set_gamma_linear(mdev, format);
++
+       mgag200_enable_display(mdev);
+       if (funcs->enable_vidrst)
+--- a/drivers/gpu/drm/mgag200/mgag200_g200ev.c
++++ b/drivers/gpu/drm/mgag200/mgag200_g200ev.c
+@@ -203,6 +203,11 @@ static void mgag200_g200ev_crtc_helper_a
+       mgag200_g200ev_set_hiprilvl(mdev);
++      if (crtc_state->gamma_lut)
++              mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data);
++      else
++              mgag200_crtc_set_gamma_linear(mdev, format);
++
+       mgag200_enable_display(mdev);
+       if (funcs->enable_vidrst)
+--- a/drivers/gpu/drm/mgag200/mgag200_g200se.c
++++ b/drivers/gpu/drm/mgag200/mgag200_g200se.c
+@@ -334,6 +334,11 @@ static void mgag200_g200se_crtc_helper_a
+       mgag200_g200se_set_hiprilvl(mdev, adjusted_mode, format);
++      if (crtc_state->gamma_lut)
++              mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data);
++      else
++              mgag200_crtc_set_gamma_linear(mdev, format);
++
+       mgag200_enable_display(mdev);
+       if (funcs->enable_vidrst)
+--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
++++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
+@@ -28,8 +28,8 @@
+  * This file contains setup code for the CRTC.
+  */
+-static void mgag200_crtc_set_gamma_linear(struct mga_device *mdev,
+-                                        const struct drm_format_info *format)
++void mgag200_crtc_set_gamma_linear(struct mga_device *mdev,
++                                 const struct drm_format_info *format)
+ {
+       int i;
+@@ -65,9 +65,9 @@ static void mgag200_crtc_set_gamma_linea
+       }
+ }
+-static void mgag200_crtc_set_gamma(struct mga_device *mdev,
+-                                 const struct drm_format_info *format,
+-                                 struct drm_color_lut *lut)
++void mgag200_crtc_set_gamma(struct mga_device *mdev,
++                          const struct drm_format_info *format,
++                          struct drm_color_lut *lut)
+ {
+       int i;
diff --git a/queue-6.6/kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch b/queue-6.6/kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch
new file mode 100644 (file)
index 0000000..ee6c896
--- /dev/null
@@ -0,0 +1,74 @@
+From 971079464001c6856186ca137778e534d983174a Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Thu, 4 Jan 2024 16:15:17 +0100
+Subject: KVM: x86/pmu: fix masking logic for MSR_CORE_PERF_GLOBAL_CTRL
+
+From: Paolo Bonzini <pbonzini@redhat.com>
+
+commit 971079464001c6856186ca137778e534d983174a upstream.
+
+When commit c59a1f106f5c ("KVM: x86/pmu: Add IA32_PEBS_ENABLE
+MSR emulation for extended PEBS") switched the initialization of
+cpuc->guest_switch_msrs to use compound literals, it screwed up
+the boolean logic:
+
++      u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable;
+...
+-      arr[0].guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask;
+-      arr[0].guest &= ~(cpuc->pebs_enabled & x86_pmu.pebs_capable);
++               .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask),
+
+Before the patch, the value of arr[0].guest would have been intel_ctrl &
+~cpuc->intel_ctrl_host_mask & ~pebs_mask.  The intent is to always treat
+PEBS events as host-only because, while the guest runs, there is no way
+to tell the processor about the virtual address where to put PEBS records
+intended for the host.
+
+Unfortunately, the new expression can be expanded to
+
+       (intel_ctrl & ~cpuc->intel_ctrl_host_mask) | (intel_ctrl & ~pebs_mask)
+
+which makes no sense; it includes any bit that isn't *both* marked as
+exclude_guest and using PEBS.  So, reinstate the old logic.  Another
+way to write it could be "intel_ctrl & ~(cpuc->intel_ctrl_host_mask |
+pebs_mask)", presumably the intention of the author of the faulty.
+However, I personally find the repeated application of A AND NOT B to
+be a bit more readable.
+
+This shows up as guest failures when running concurrent long-running
+perf workloads on the host, and was reported to happen with rcutorture.
+All guests on a given host would die simultaneously with something like an
+instruction fault or a segmentation violation.
+
+Reported-by: Paul E. McKenney <paulmck@kernel.org>
+Analyzed-by: Sean Christopherson <seanjc@google.com>
+Tested-by: Paul E. McKenney <paulmck@kernel.org>
+Cc: stable@vger.kernel.org
+Fixes: c59a1f106f5c ("KVM: x86/pmu: Add IA32_PEBS_ENABLE MSR emulation for extended PEBS")
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/events/intel/core.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/arch/x86/events/intel/core.c
++++ b/arch/x86/events/intel/core.c
+@@ -4062,12 +4062,17 @@ static struct perf_guest_switch_msr *int
+       u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable;
+       int global_ctrl, pebs_enable;
++      /*
++       * In addition to obeying exclude_guest/exclude_host, remove bits being
++       * used for PEBS when running a guest, because PEBS writes to virtual
++       * addresses (not physical addresses).
++       */
+       *nr = 0;
+       global_ctrl = (*nr)++;
+       arr[global_ctrl] = (struct perf_guest_switch_msr){
+               .msr = MSR_CORE_PERF_GLOBAL_CTRL,
+               .host = intel_ctrl & ~cpuc->intel_ctrl_guest_mask,
+-              .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask),
++              .guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask & ~pebs_mask,
+       };
+       if (!x86_pmu.pebs)
diff --git a/queue-6.6/mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch b/queue-6.6/mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch
new file mode 100644 (file)
index 0000000..bc6014b
--- /dev/null
@@ -0,0 +1,72 @@
+From 4c0288299fd09ee7c6fbe2f57421f314d8c981db Mon Sep 17 00:00:00 2001
+From: Paolo Abeni <pabeni@redhat.com>
+Date: Tue, 26 Dec 2023 13:10:18 +0100
+Subject: mptcp: prevent tcp diag from closing listener subflows
+
+From: Paolo Abeni <pabeni@redhat.com>
+
+commit 4c0288299fd09ee7c6fbe2f57421f314d8c981db upstream.
+
+The MPTCP protocol does not expect that any other entity could change
+the first subflow status when such socket is listening.
+Unfortunately the TCP diag interface allows aborting any TCP socket,
+including MPTCP listeners subflows. As reported by syzbot, that trigger
+a WARN() and could lead to later bigger trouble.
+
+The MPTCP protocol needs to do some MPTCP-level cleanup actions to
+properly shutdown the listener. To keep the fix simple, prevent
+entirely the diag interface from stopping such listeners.
+
+We could refine the diag callback in a later, larger patch targeting
+net-next.
+
+Fixes: 57fc0f1ceaa4 ("mptcp: ensure listener is unhashed before updating the sk status")
+Cc: stable@vger.kernel.org
+Reported-by: <syzbot+5a01c3a666e726bc8752@syzkaller.appspotmail.com>
+Closes: https://lore.kernel.org/netdev/0000000000004f4579060c68431b@google.com/
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts <matttbe@kernel.org>
+Link: https://lore.kernel.org/r/20231226-upstream-net-20231226-mptcp-prevent-warn-v1-2-1404dcc431ea@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/subflow.c |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/net/mptcp/subflow.c
++++ b/net/mptcp/subflow.c
+@@ -1974,6 +1974,17 @@ static void tcp_release_cb_override(stru
+       tcp_release_cb(ssk);
+ }
++static int tcp_abort_override(struct sock *ssk, int err)
++{
++      /* closing a listener subflow requires a great deal of care.
++       * keep it simple and just prevent such operation
++       */
++      if (inet_sk_state_load(ssk) == TCP_LISTEN)
++              return -EINVAL;
++
++      return tcp_abort(ssk, err);
++}
++
+ static struct tcp_ulp_ops subflow_ulp_ops __read_mostly = {
+       .name           = "mptcp",
+       .owner          = THIS_MODULE,
+@@ -2018,6 +2029,7 @@ void __init mptcp_subflow_init(void)
+       tcp_prot_override = tcp_prot;
+       tcp_prot_override.release_cb = tcp_release_cb_override;
++      tcp_prot_override.diag_destroy = tcp_abort_override;
+ #if IS_ENABLED(CONFIG_MPTCP_IPV6)
+       /* In struct mptcp_subflow_request_sock, we assume the TCP request sock
+@@ -2054,6 +2066,7 @@ void __init mptcp_subflow_init(void)
+       tcpv6_prot_override = tcpv6_prot;
+       tcpv6_prot_override.release_cb = tcp_release_cb_override;
++      tcpv6_prot_override.diag_destroy = tcp_abort_override;
+ #endif
+       mptcp_diag_subflow_init(&subflow_ulp_ops);
diff --git a/queue-6.6/revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch b/queue-6.6/revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch
new file mode 100644 (file)
index 0000000..71fbb86
--- /dev/null
@@ -0,0 +1,103 @@
+From f93e71aea6c60ebff8adbd8941e678302d377869 Mon Sep 17 00:00:00 2001
+From: Bjorn Helgaas <bhelgaas@google.com>
+Date: Mon, 1 Jan 2024 12:08:18 -0600
+Subject: Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()"
+
+From: Bjorn Helgaas <bhelgaas@google.com>
+
+commit f93e71aea6c60ebff8adbd8941e678302d377869 upstream.
+
+This reverts commit 08d0cc5f34265d1a1e3031f319f594bd1970976c.
+
+Michael reported that when attempting to resume from suspend to RAM on ASUS
+mini PC PN51-BB757MDE1 (DMI model: MINIPC PN51-E1), 08d0cc5f3426
+("PCI/ASPM: Remove pcie_aspm_pm_state_change()") caused a 12-second delay
+with no output, followed by a reboot.
+
+Workarounds include:
+
+  - Reverting 08d0cc5f3426 ("PCI/ASPM: Remove pcie_aspm_pm_state_change()")
+  - Booting with "pcie_aspm=off"
+  - Booting with "pcie_aspm.policy=performance"
+  - "echo 0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/link/l1_aspm"
+    before suspending
+  - Connecting a USB flash drive
+
+Link: https://lore.kernel.org/r/20240102232550.1751655-1-helgaas@kernel.org
+Fixes: 08d0cc5f3426 ("PCI/ASPM: Remove pcie_aspm_pm_state_change()")
+Reported-by: Michael Schaller <michael@5challer.de>
+Link: https://lore.kernel.org/r/76c61361-b8b4-435f-a9f1-32b716763d62@5challer.de
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/pci/pci.c       |    6 ++++++
+ drivers/pci/pci.h       |    2 ++
+ drivers/pci/pcie/aspm.c |   19 +++++++++++++++++++
+ 3 files changed, 27 insertions(+)
+
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -1335,6 +1335,9 @@ static int pci_set_full_power_state(stru
+               pci_restore_bars(dev);
+       }
++      if (dev->bus->self)
++              pcie_aspm_pm_state_change(dev->bus->self);
++
+       return 0;
+ }
+@@ -1429,6 +1432,9 @@ static int pci_set_low_power_state(struc
+                                    pci_power_name(dev->current_state),
+                                    pci_power_name(state));
++      if (dev->bus->self)
++              pcie_aspm_pm_state_change(dev->bus->self);
++
+       return 0;
+ }
+--- a/drivers/pci/pci.h
++++ b/drivers/pci/pci.h
+@@ -566,10 +566,12 @@ int pcie_retrain_link(struct pci_dev *pd
+ #ifdef CONFIG_PCIEASPM
+ void pcie_aspm_init_link_state(struct pci_dev *pdev);
+ void pcie_aspm_exit_link_state(struct pci_dev *pdev);
++void pcie_aspm_pm_state_change(struct pci_dev *pdev);
+ void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
+ #else
+ static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { }
+ static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { }
++static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { }
+ static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { }
+ #endif
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -1001,6 +1001,25 @@ void pcie_aspm_exit_link_state(struct pc
+       up_read(&pci_bus_sem);
+ }
++/* @pdev: the root port or switch downstream port */
++void pcie_aspm_pm_state_change(struct pci_dev *pdev)
++{
++      struct pcie_link_state *link = pdev->link_state;
++
++      if (aspm_disabled || !link)
++              return;
++      /*
++       * Devices changed PM state, we should recheck if latency
++       * meets all functions' requirement
++       */
++      down_read(&pci_bus_sem);
++      mutex_lock(&aspm_lock);
++      pcie_update_aspm_capable(link->root);
++      pcie_config_aspm_path(link);
++      mutex_unlock(&aspm_lock);
++      up_read(&pci_bus_sem);
++}
++
+ void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
+ {
+       struct pcie_link_state *link = pdev->link_state;
index 513ba449a4a0d820f7a3585268db9ed1c2ff2a8f..5a68b6e9455dc0069b0d48573bfeff13adffb22f 100644 (file)
@@ -1,4 +1,17 @@
 keys-dns-fix-missing-size-check-of-v1-server-list-header.patch
+alsa-hda-tas2781-do-not-use-regcache.patch
+alsa-hda-tas2781-move-set_drv_data-outside-tasdevice_init.patch
+alsa-hda-tas2781-remove-sound-controls-in-unbind.patch
+alsa-hda-realtek-enable-snd_pci_quirk-for-hp-pavilion-14-ec1xxx-series.patch
+alsa-hda-realtek-fix-mute-micmute-leds-for-a-hp-zbook.patch
+alsa-hda-realtek-fix-mute-and-mic-mute-leds-for-hp-probook-440-g6.patch
+drm-amd-display-pbn_div-need-be-updated-for-hotplug-event.patch
+mptcp-prevent-tcp-diag-from-closing-listener-subflows.patch
+revert-pci-aspm-remove-pcie_aspm_pm_state_change.patch
+drm-mgag200-fix-gamma-lut-not-initialized-for-g200er-g200ev-g200se.patch
+cifs-cifs_chan_is_iface_active-should-be-called-with-chan_lock-held.patch
+cifs-do-not-depend-on-release_iface-for-maintaining-iface_list.patch
+kvm-x86-pmu-fix-masking-logic-for-msr_core_perf_global_ctrl.patch
 accel-qaic-fix-gem-import-path-code.patch
 accel-qaic-implement-quirk-for-soc_hw_version.patch
 wifi-iwlwifi-pcie-don-t-synchronize-irqs-from-irq.patch