summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorgraysky2023-09-21 12:54:28 -0400
committergraysky2023-09-21 12:54:28 -0400
commit6832ee85ff309cd12f099d7e106fe0655e909f11 (patch)
tree04f6bf66744cbd128c5debf1adfa138001e17a34
parent0d97a2c192a733b0af31449a756cef7d015814a5 (diff)
downloadaur-6832ee85ff309cd12f099d7e106fe0655e909f11.tar.gz
Update to 6.5.4-2
-rw-r--r--.SRCINFO24
-rw-r--r--0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch2
-rw-r--r--0002-drivers-firmware-skip-simpledrm-if-nvidia-drm.modese.patch4
-rw-r--r--0003-ASoC-Intel-soc-acpi-fix-Dell-SKU-0B34.patch2
-rw-r--r--0004-btrfs-wait-on-uncached-block-groups-on-every-allocat.patch4
-rw-r--r--0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch4
-rw-r--r--0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch3
-rw-r--r--0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch2
-rw-r--r--0008-i915-Limit-the-length-of-an-sg-list-to-the-requested.patch69
-rw-r--r--0009-net-wwan-t7xx-Add-AP-CLDMA.patch508
-rw-r--r--0010-nvme-avoid-bogus-CRTO-values.patch108
-rw-r--r--0011-Revert-101bd907b424-misc-rtsx-judge-ASPM-Mode-to-set.patch193
-rw-r--r--PKGBUILD35
13 files changed, 924 insertions, 34 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 5efeb9eff111..e68457ce3897 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = linux-ck
pkgver = 6.5.4
- pkgrel = 1
+ pkgrel = 2
url = https://wiki.archlinux.org/index.php/Linux-ck
arch = x86_64
license = GPL2
@@ -27,6 +27,10 @@ pkgbase = linux-ck
source = 0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch
source = 0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch
source = 0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch
+ source = 0008-i915-Limit-the-length-of-an-sg-list-to-the-requested.patch
+ source = 0009-net-wwan-t7xx-Add-AP-CLDMA.patch
+ source = 0010-nvme-avoid-bogus-CRTO-values.patch
+ source = 0011-Revert-101bd907b424-misc-rtsx-judge-ASPM-Mode-to-set.patch
validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886
validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E
sha256sums = bdf76c15229b241e578046b8486106f09534d754ea4cbf105e0660e551fb1669
@@ -34,13 +38,17 @@ pkgbase = linux-ck
sha256sums = 46451dbc3305d4c2e726a2f1943bddf697c5bb6815d93e5baed80bca82e53fdc
sha256sums = f1d586e111932890ad5e0df15d092fb9b3f87bae4ea17812aae9b0ec98fe2db0
sha256sums = a86a59d089ddd4f31565ff6a27ba74f4697ffa0ab0f57dc839e1da6ab83d77a4
- sha256sums = bbf2c993e10c1a59b48a7d05075b9593ebffc4196fd7f748d12e6823de3a94a9
- sha256sums = c9ed33e551bc45617ce9331da43535bc3af3ff20553561d5b8a5d3f4265a65c1
- sha256sums = 5627f3cf0e65f9d269d30d3e2380582fdaa74b0b5322e14389988a5ce8328ab5
- sha256sums = a3633a05054e68196ebf7654692cc30554198e88e2f54c3440cb7f64600cb0d5
- sha256sums = 97da17e086d39aff622c7b17dfc169ddd50c62691274d15b4505c8b79238c829
- sha256sums = 5caecd368e426c8429107f3db84cd39e4f3b2d2cfa2ae665234704367f5190c0
- sha256sums = 1e8c0474375e798ef538efc3cb3e5f6a72b820d98f4f0b620008fda60b8a18d6
+ sha256sums = e83c0dfa73fafb09b24a38e0c62767515177ae8e29eb511592f0af0083a08a97
+ sha256sums = 0fbc4ce4428ac446752dc192709c21764018abf03046402ddd27409f2fac7172
+ sha256sums = 8cac889e375641832fdc68eddd16e7c2febe0207cd117710d0d1876270afd4c7
+ sha256sums = 36ad01102f1005d855c5e0c9d6b91e2b24654e7e971a32c1f3acb6a59bf4b270
+ sha256sums = 32da7426bb107b29835ce45322ca40fb0c1c56f90574bec8e8fc9b94f5255220
+ sha256sums = 5208324060bc7ac4d418a5503763f6f0f7e99c79b83216ebfde4ac778942bf66
+ sha256sums = fc655539835f8910841da651c46f4d709c6d82cf578066e0c5c25c0588228aee
+ sha256sums = ec8a7654fc9900923b85f2876e61e8bd7bffe9c8a85ee07b3cb7af47b01dc578
+ sha256sums = 30c1656ae0776a769373eb3dca9587e398d5a05517bfa30a3c1573861ad4b155
+ sha256sums = 96babd7c1ab75f4b5d2b512cbb105857242419ac1fc5bc41a207fd95a99f4b35
+ sha256sums = 5376296a6c24bfdcb7f6f5f0eddb5dd9a12dedfbeb92d4fe6185828db9988494
pkgname = linux-ck
pkgdesc = The Linux kernel and modules with ck's hrtimer patches
diff --git a/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch b/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
index 369897bda230..5e543ce18b22 100644
--- a/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
+++ b/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch
@@ -1,7 +1,7 @@
From 5681f5c2be9f5c088cafcd014edd21814771435c Mon Sep 17 00:00:00 2001
From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
Date: Mon, 16 Sep 2019 04:53:20 +0200
-Subject: [PATCH 1/8] ZEN: Add sysctl and CONFIG to disallow unprivileged
+Subject: [PATCH 01/12] ZEN: Add sysctl and CONFIG to disallow unprivileged
CLONE_NEWUSER
Our default behavior continues to match the vanilla kernel.
diff --git a/0002-drivers-firmware-skip-simpledrm-if-nvidia-drm.modese.patch b/0002-drivers-firmware-skip-simpledrm-if-nvidia-drm.modese.patch
index ae33f37af658..0b90a24b3139 100644
--- a/0002-drivers-firmware-skip-simpledrm-if-nvidia-drm.modese.patch
+++ b/0002-drivers-firmware-skip-simpledrm-if-nvidia-drm.modese.patch
@@ -1,8 +1,8 @@
From e8fe6978baa2399d67ad282fd88ffe5055785511 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
Date: Thu, 19 May 2022 14:40:07 +0200
-Subject: [PATCH 2/8] drivers/firmware: skip simpledrm if nvidia-drm.modeset=1
- is set
+Subject: [PATCH 02/12] drivers/firmware: skip simpledrm if
+ nvidia-drm.modeset=1 is set
The Nvidia proprietary driver has some bugs that leads to issues if used
with the simpledrm driver. The most noticeable is that does not register
diff --git a/0003-ASoC-Intel-soc-acpi-fix-Dell-SKU-0B34.patch b/0003-ASoC-Intel-soc-acpi-fix-Dell-SKU-0B34.patch
index 80feb4bad7cf..387d6335c264 100644
--- a/0003-ASoC-Intel-soc-acpi-fix-Dell-SKU-0B34.patch
+++ b/0003-ASoC-Intel-soc-acpi-fix-Dell-SKU-0B34.patch
@@ -1,7 +1,7 @@
From 1bb932dfe6f18ba9472ec0d89ba69d8858f6405b Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Date: Tue, 5 Sep 2023 11:16:16 -0400
-Subject: [PATCH 3/8] ASoC: Intel: soc-acpi: fix Dell SKU 0B34
+Subject: [PATCH 03/12] ASoC: Intel: soc-acpi: fix Dell SKU 0B34
The rule for the SoundWire tables is that the platforms with more
devices need to be added first. We broke that rule with the Dell SKU
diff --git a/0004-btrfs-wait-on-uncached-block-groups-on-every-allocat.patch b/0004-btrfs-wait-on-uncached-block-groups-on-every-allocat.patch
index 9d7ae9df1b40..1a26929cc527 100644
--- a/0004-btrfs-wait-on-uncached-block-groups-on-every-allocat.patch
+++ b/0004-btrfs-wait-on-uncached-block-groups-on-every-allocat.patch
@@ -1,8 +1,8 @@
From 07d424465a582144b433c37b4b7921f2d35f5507 Mon Sep 17 00:00:00 2001
From: Josef Bacik <josef@toxicpanda.com>
Date: Mon, 31 Jul 2023 16:28:43 -0400
-Subject: [PATCH 4/8] btrfs: wait on uncached block groups on every allocation
- loop
+Subject: [PATCH 04/12] btrfs: wait on uncached block groups on every
+ allocation loop
My initial fix for the generic/475 hangs was related to metadata, but
our CI testing uncovered another case where we hang for similar reasons.
diff --git a/0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch b/0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch
index 3f80dae43f14..e7c95a263d01 100644
--- a/0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch
+++ b/0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch
@@ -1,8 +1,8 @@
From 930c05e80d31e87982e9f64accb8ffbc6a135687 Mon Sep 17 00:00:00 2001
From: Filipe Manana <fdmanana@suse.com>
Date: Sat, 9 Sep 2023 11:34:40 +0100
-Subject: [PATCH 5/8] btrfs: set last dir index to the current last index when
- opening dir
+Subject: [PATCH 05/12] btrfs: set last dir index to the current last index
+ when opening dir
When opening a directory for reading it, we set the last index where we
stop iteration to the value in struct btrfs_inode::index_cnt. That value
diff --git a/0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch b/0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch
index a6628fafe07b..530bfca803e7 100644
--- a/0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch
+++ b/0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch
@@ -1,7 +1,8 @@
From cd0498ab46920777435bd0b8e108e0f999320ac2 Mon Sep 17 00:00:00 2001
From: Filipe Manana <fdmanana@suse.com>
Date: Sat, 9 Sep 2023 12:12:14 +0100
-Subject: [PATCH 6/8] btrfs: refresh dir last index during a rewinddir(3) call
+Subject: [PATCH 06/12] btrfs: refresh dir last index during a rewinddir(3)
+ call
When opening a directory we find what's the index of its last entry and
then store it in the directory's file handle private data (struct
diff --git a/0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch b/0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch
index 0742e11462f8..0bc05dcc88c5 100644
--- a/0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch
+++ b/0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch
@@ -1,7 +1,7 @@
From 47c0fdda664600f0568addd32f954a5cb6257fa1 Mon Sep 17 00:00:00 2001
From: Filipe Manana <fdmanana@suse.com>
Date: Tue, 12 Sep 2023 11:45:39 +0100
-Subject: [PATCH 7/8] btrfs: fix race between reading a directory and adding
+Subject: [PATCH 07/12] btrfs: fix race between reading a directory and adding
entries to it
When opening a directory (opendir(3)) or rewinding it (rewinddir(3)), we
diff --git a/0008-i915-Limit-the-length-of-an-sg-list-to-the-requested.patch b/0008-i915-Limit-the-length-of-an-sg-list-to-the-requested.patch
new file mode 100644
index 000000000000..3fb1734d295e
--- /dev/null
+++ b/0008-i915-Limit-the-length-of-an-sg-list-to-the-requested.patch
@@ -0,0 +1,69 @@
+From c670ecb2eab00d8724859056268835798a78f233 Mon Sep 17 00:00:00 2001
+From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
+Date: Tue, 19 Sep 2023 20:48:55 +0100
+Subject: [PATCH 08/12] i915: Limit the length of an sg list to the requested
+ length
+
+The folio conversion changed the behaviour of shmem_sg_alloc_table() to
+put the entire length of the last folio into the sg list, even if the sg
+list should have been shorter. gen8_ggtt_insert_entries() relied on the
+list being the right langth and would overrun the end of the page tables.
+Other functions may also have been affected.
+
+Clamp the length of the last entry in the sg list to be the expected
+length.
+
+Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
+Fixes: 0b62af28f249 ("i915: convert shmem_sg_free_table() to use a folio_batch")
+Cc: stable@vger.kernel.org # 6.5.x
+Link: https://gitlab.freedesktop.org/drm/intel/-/issues/9256
+Link: https://lore.kernel.org/lkml/6287208.lOV4Wx5bFT@natalenko.name/
+Reported-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Cherry-picked-for: https://bugs.archlinux.org/task/79569
+---
+ drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+index 8f1633c3fb93..73a4a4eb29e0 100644
+--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
++++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+@@ -100,6 +100,7 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st,
+ st->nents = 0;
+ for (i = 0; i < page_count; i++) {
+ struct folio *folio;
++ unsigned long nr_pages;
+ const unsigned int shrink[] = {
+ I915_SHRINK_BOUND | I915_SHRINK_UNBOUND,
+ 0,
+@@ -150,6 +151,8 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st,
+ }
+ } while (1);
+
++ nr_pages = min_t(unsigned long,
++ folio_nr_pages(folio), page_count - i);
+ if (!i ||
+ sg->length >= max_segment ||
+ folio_pfn(folio) != next_pfn) {
+@@ -157,13 +160,13 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st,
+ sg = sg_next(sg);
+
+ st->nents++;
+- sg_set_folio(sg, folio, folio_size(folio), 0);
++ sg_set_folio(sg, folio, nr_pages * PAGE_SIZE, 0);
+ } else {
+ /* XXX: could overflow? */
+- sg->length += folio_size(folio);
++ sg->length += nr_pages * PAGE_SIZE;
+ }
+- next_pfn = folio_pfn(folio) + folio_nr_pages(folio);
+- i += folio_nr_pages(folio) - 1;
++ next_pfn = folio_pfn(folio) + nr_pages;
++ i += nr_pages - 1;
+
+ /* Check that the i965g/gm workaround works. */
+ GEM_BUG_ON(gfp & __GFP_DMA32 && next_pfn >= 0x00100000UL);
+--
+2.42.0
+
diff --git a/0009-net-wwan-t7xx-Add-AP-CLDMA.patch b/0009-net-wwan-t7xx-Add-AP-CLDMA.patch
new file mode 100644
index 000000000000..53c357a96807
--- /dev/null
+++ b/0009-net-wwan-t7xx-Add-AP-CLDMA.patch
@@ -0,0 +1,508 @@
+From c21ba287d8ffc883987593b24b4058964e242c84 Mon Sep 17 00:00:00 2001
+From: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
+Date: Tue, 11 Jul 2023 08:28:13 +0200
+Subject: [PATCH 09/12] net: wwan: t7xx: Add AP CLDMA
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+At this moment with the current status, t7xx is not functional due to
+problems like this after connection, if there is no activity:
+[ 57.370534] mtk_t7xx 0000:72:00.0: [PM] SAP suspend error: -110
+[ 57.370581] mtk_t7xx 0000:72:00.0: can't suspend
+ (t7xx_pci_pm_runtime_suspend [mtk_t7xx] returned -110)
+because after this, the traffic no longer works.
+
+The complete series 'net: wwan: t7xx: fw flashing & coredump support'
+was reverted because of issues with the pci implementation.
+In order to have at least the modem working, it would be enough if just
+the first commit of the series is re-applied:
+d20ef656f994 net: wwan: t7xx: Add AP CLDMA
+With that, the Application Processor would be controlled, correctly
+suspended and the commented problems would be fixed (I am testing here
+like this with no related issue).
+
+This commit is independent of the others and not related to the
+commented pci implementation for the new features: fw flashing and
+coredump collection.
+
+Use v2 patch version of d20ef656f994 as JinJian Song suggests
+(https://patchwork.kernel.org/project/netdevbpf/patch/20230105154215.198828-1-m.chetan.kumar@linux.intel.com/).
+
+Original text from the commit that would be re-applied:
+
+ d20ef656f994 net: wwan: t7xx: Add AP CLDMA
+ Author: Haijun Liu <haijun.liu@mediatek.com>
+ Date: Tue Aug 16 09:53:28 2022 +0530
+
+ The t7xx device contains two Cross Layer DMA (CLDMA) interfaces to
+ communicate with AP and Modem processors respectively. So far only
+ MD-CLDMA was being used, this patch enables AP-CLDMA.
+
+ Rename small Application Processor (sAP) to AP.
+
+ Signed-off-by: Haijun Liu <haijun.liu@mediatek.com>
+ Co-developed-by: Madhusmita Sahu <madhusmita.sahu@intel.com>
+ Signed-off-by: Madhusmita Sahu <madhusmita.sahu@intel.com>
+ Signed-off-by: Moises Veleta <moises.veleta@linux.intel.com>
+ Signed-off-by: Devegowda Chandrashekar <chandrashekar.devegowda@intel.com>
+ Signed-off-by: M Chetan Kumar <m.chetan.kumar@linux.intel.com>
+ Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+ Reviewed-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
+ Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
+
+Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Link: https://lore.kernel.org/r/20230711062817.6108-1-jtornosm@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Cherry-picked-for: https://bugs.archlinux.org/task/79728
+---
+ drivers/net/wwan/t7xx/t7xx_hif_cldma.c | 17 +++--
+ drivers/net/wwan/t7xx/t7xx_hif_cldma.h | 2 +-
+ drivers/net/wwan/t7xx/t7xx_mhccif.h | 1 +
+ drivers/net/wwan/t7xx/t7xx_modem_ops.c | 76 +++++++++++++++++-----
+ drivers/net/wwan/t7xx/t7xx_modem_ops.h | 2 +
+ drivers/net/wwan/t7xx/t7xx_port.h | 6 +-
+ drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c | 8 ++-
+ drivers/net/wwan/t7xx/t7xx_port_proxy.c | 18 ++++-
+ drivers/net/wwan/t7xx/t7xx_reg.h | 2 +-
+ drivers/net/wwan/t7xx/t7xx_state_monitor.c | 13 +++-
+ drivers/net/wwan/t7xx/t7xx_state_monitor.h | 2 +
+ 11 files changed, 116 insertions(+), 31 deletions(-)
+
+diff --git a/drivers/net/wwan/t7xx/t7xx_hif_cldma.c b/drivers/net/wwan/t7xx/t7xx_hif_cldma.c
+index 7162bf38a8c9..cc70360364b7 100644
+--- a/drivers/net/wwan/t7xx/t7xx_hif_cldma.c
++++ b/drivers/net/wwan/t7xx/t7xx_hif_cldma.c
+@@ -1066,13 +1066,18 @@ static void t7xx_hw_info_init(struct cldma_ctrl *md_ctrl)
+ struct t7xx_cldma_hw *hw_info = &md_ctrl->hw_info;
+ u32 phy_ao_base, phy_pd_base;
+
+- if (md_ctrl->hif_id != CLDMA_ID_MD)
+- return;
+-
+- phy_ao_base = CLDMA1_AO_BASE;
+- phy_pd_base = CLDMA1_PD_BASE;
+- hw_info->phy_interrupt_id = CLDMA1_INT;
+ hw_info->hw_mode = MODE_BIT_64;
++
++ if (md_ctrl->hif_id == CLDMA_ID_MD) {
++ phy_ao_base = CLDMA1_AO_BASE;
++ phy_pd_base = CLDMA1_PD_BASE;
++ hw_info->phy_interrupt_id = CLDMA1_INT;
++ } else {
++ phy_ao_base = CLDMA0_AO_BASE;
++ phy_pd_base = CLDMA0_PD_BASE;
++ hw_info->phy_interrupt_id = CLDMA0_INT;
++ }
++
+ hw_info->ap_ao_base = t7xx_pcie_addr_transfer(pbase->pcie_ext_reg_base,
+ pbase->pcie_dev_reg_trsl_addr, phy_ao_base);
+ hw_info->ap_pdn_base = t7xx_pcie_addr_transfer(pbase->pcie_ext_reg_base,
+diff --git a/drivers/net/wwan/t7xx/t7xx_hif_cldma.h b/drivers/net/wwan/t7xx/t7xx_hif_cldma.h
+index 47a35e552da7..4410bac6993a 100644
+--- a/drivers/net/wwan/t7xx/t7xx_hif_cldma.h
++++ b/drivers/net/wwan/t7xx/t7xx_hif_cldma.h
+@@ -34,7 +34,7 @@
+ /**
+ * enum cldma_id - Identifiers for CLDMA HW units.
+ * @CLDMA_ID_MD: Modem control channel.
+- * @CLDMA_ID_AP: Application Processor control channel (not used at the moment).
++ * @CLDMA_ID_AP: Application Processor control channel.
+ * @CLDMA_NUM: Number of CLDMA HW units available.
+ */
+ enum cldma_id {
+diff --git a/drivers/net/wwan/t7xx/t7xx_mhccif.h b/drivers/net/wwan/t7xx/t7xx_mhccif.h
+index 209b386bc088..20c50dce9fc3 100644
+--- a/drivers/net/wwan/t7xx/t7xx_mhccif.h
++++ b/drivers/net/wwan/t7xx/t7xx_mhccif.h
+@@ -25,6 +25,7 @@
+ D2H_INT_EXCEPTION_CLEARQ_DONE | \
+ D2H_INT_EXCEPTION_ALLQ_RESET | \
+ D2H_INT_PORT_ENUM | \
++ D2H_INT_ASYNC_AP_HK | \
+ D2H_INT_ASYNC_MD_HK)
+
+ void t7xx_mhccif_mask_set(struct t7xx_pci_dev *t7xx_dev, u32 val);
+diff --git a/drivers/net/wwan/t7xx/t7xx_modem_ops.c b/drivers/net/wwan/t7xx/t7xx_modem_ops.c
+index 7d0f5e4f0a78..24e7d491468e 100644
+--- a/drivers/net/wwan/t7xx/t7xx_modem_ops.c
++++ b/drivers/net/wwan/t7xx/t7xx_modem_ops.c
+@@ -44,6 +44,7 @@
+ #include "t7xx_state_monitor.h"
+
+ #define RT_ID_MD_PORT_ENUM 0
++#define RT_ID_AP_PORT_ENUM 1
+ /* Modem feature query identification code - "ICCC" */
+ #define MD_FEATURE_QUERY_ID 0x49434343
+
+@@ -298,6 +299,7 @@ static void t7xx_md_exception(struct t7xx_modem *md, enum hif_ex_stage stage)
+ }
+
+ t7xx_cldma_exception(md->md_ctrl[CLDMA_ID_MD], stage);
++ t7xx_cldma_exception(md->md_ctrl[CLDMA_ID_AP], stage);
+
+ if (stage == HIF_EX_INIT)
+ t7xx_mhccif_h2d_swint_trigger(t7xx_dev, H2D_CH_EXCEPTION_ACK);
+@@ -426,7 +428,7 @@ static int t7xx_parse_host_rt_data(struct t7xx_fsm_ctl *ctl, struct t7xx_sys_inf
+ if (ft_spt_st != MTK_FEATURE_MUST_BE_SUPPORTED)
+ return -EINVAL;
+
+- if (i == RT_ID_MD_PORT_ENUM)
++ if (i == RT_ID_MD_PORT_ENUM || i == RT_ID_AP_PORT_ENUM)
+ t7xx_port_enum_msg_handler(ctl->md, rt_feature->data);
+ }
+
+@@ -456,12 +458,12 @@ static int t7xx_core_reset(struct t7xx_modem *md)
+ return 0;
+ }
+
+-static void t7xx_core_hk_handler(struct t7xx_modem *md, struct t7xx_fsm_ctl *ctl,
++static void t7xx_core_hk_handler(struct t7xx_modem *md, struct t7xx_sys_info *core_info,
++ struct t7xx_fsm_ctl *ctl,
+ enum t7xx_fsm_event_state event_id,
+ enum t7xx_fsm_event_state err_detect)
+ {
+ struct t7xx_fsm_event *event = NULL, *event_next;
+- struct t7xx_sys_info *core_info = &md->core_md;
+ struct device *dev = &md->t7xx_dev->pdev->dev;
+ unsigned long flags;
+ int ret;
+@@ -531,19 +533,33 @@ static void t7xx_md_hk_wq(struct work_struct *work)
+ t7xx_cldma_start(md->md_ctrl[CLDMA_ID_MD]);
+ t7xx_fsm_broadcast_state(ctl, MD_STATE_WAITING_FOR_HS2);
+ md->core_md.handshake_ongoing = true;
+- t7xx_core_hk_handler(md, ctl, FSM_EVENT_MD_HS2, FSM_EVENT_MD_HS2_EXIT);
++ t7xx_core_hk_handler(md, &md->core_md, ctl, FSM_EVENT_MD_HS2, FSM_EVENT_MD_HS2_EXIT);
++}
++
++static void t7xx_ap_hk_wq(struct work_struct *work)
++{
++ struct t7xx_modem *md = container_of(work, struct t7xx_modem, ap_handshake_work);
++ struct t7xx_fsm_ctl *ctl = md->fsm_ctl;
++
++ /* Clear the HS2 EXIT event appended in t7xx_core_reset(). */
++ t7xx_fsm_clr_event(ctl, FSM_EVENT_AP_HS2_EXIT);
++ t7xx_cldma_stop(md->md_ctrl[CLDMA_ID_AP]);
++ t7xx_cldma_switch_cfg(md->md_ctrl[CLDMA_ID_AP]);
++ t7xx_cldma_start(md->md_ctrl[CLDMA_ID_AP]);
++ md->core_ap.handshake_ongoing = true;
++ t7xx_core_hk_handler(md, &md->core_ap, ctl, FSM_EVENT_AP_HS2, FSM_EVENT_AP_HS2_EXIT);
+ }
+
+ void t7xx_md_event_notify(struct t7xx_modem *md, enum md_event_id evt_id)
+ {
+ struct t7xx_fsm_ctl *ctl = md->fsm_ctl;
+- void __iomem *mhccif_base;
+ unsigned int int_sta;
+ unsigned long flags;
+
+ switch (evt_id) {
+ case FSM_PRE_START:
+- t7xx_mhccif_mask_clr(md->t7xx_dev, D2H_INT_PORT_ENUM);
++ t7xx_mhccif_mask_clr(md->t7xx_dev, D2H_INT_PORT_ENUM | D2H_INT_ASYNC_MD_HK |
++ D2H_INT_ASYNC_AP_HK);
+ break;
+
+ case FSM_START:
+@@ -556,16 +572,26 @@ void t7xx_md_event_notify(struct t7xx_modem *md, enum md_event_id evt_id)
+ ctl->exp_flg = true;
+ md->exp_id &= ~D2H_INT_EXCEPTION_INIT;
+ md->exp_id &= ~D2H_INT_ASYNC_MD_HK;
++ md->exp_id &= ~D2H_INT_ASYNC_AP_HK;
+ } else if (ctl->exp_flg) {
+ md->exp_id &= ~D2H_INT_ASYNC_MD_HK;
+- } else if (md->exp_id & D2H_INT_ASYNC_MD_HK) {
+- queue_work(md->handshake_wq, &md->handshake_work);
+- md->exp_id &= ~D2H_INT_ASYNC_MD_HK;
+- mhccif_base = md->t7xx_dev->base_addr.mhccif_rc_base;
+- iowrite32(D2H_INT_ASYNC_MD_HK, mhccif_base + REG_EP2RC_SW_INT_ACK);
+- t7xx_mhccif_mask_set(md->t7xx_dev, D2H_INT_ASYNC_MD_HK);
++ md->exp_id &= ~D2H_INT_ASYNC_AP_HK;
+ } else {
+- t7xx_mhccif_mask_clr(md->t7xx_dev, D2H_INT_ASYNC_MD_HK);
++ void __iomem *mhccif_base = md->t7xx_dev->base_addr.mhccif_rc_base;
++
++ if (md->exp_id & D2H_INT_ASYNC_MD_HK) {
++ queue_work(md->handshake_wq, &md->handshake_work);
++ md->exp_id &= ~D2H_INT_ASYNC_MD_HK;
++ iowrite32(D2H_INT_ASYNC_MD_HK, mhccif_base + REG_EP2RC_SW_INT_ACK);
++ t7xx_mhccif_mask_set(md->t7xx_dev, D2H_INT_ASYNC_MD_HK);
++ }
++
++ if (md->exp_id & D2H_INT_ASYNC_AP_HK) {
++ queue_work(md->handshake_wq, &md->ap_handshake_work);
++ md->exp_id &= ~D2H_INT_ASYNC_AP_HK;
++ iowrite32(D2H_INT_ASYNC_AP_HK, mhccif_base + REG_EP2RC_SW_INT_ACK);
++ t7xx_mhccif_mask_set(md->t7xx_dev, D2H_INT_ASYNC_AP_HK);
++ }
+ }
+ spin_unlock_irqrestore(&md->exp_lock, flags);
+
+@@ -578,6 +604,7 @@ void t7xx_md_event_notify(struct t7xx_modem *md, enum md_event_id evt_id)
+
+ case FSM_READY:
+ t7xx_mhccif_mask_set(md->t7xx_dev, D2H_INT_ASYNC_MD_HK);
++ t7xx_mhccif_mask_set(md->t7xx_dev, D2H_INT_ASYNC_AP_HK);
+ break;
+
+ default:
+@@ -629,6 +656,12 @@ static struct t7xx_modem *t7xx_md_alloc(struct t7xx_pci_dev *t7xx_dev)
+ md->core_md.feature_set[RT_ID_MD_PORT_ENUM] &= ~FEATURE_MSK;
+ md->core_md.feature_set[RT_ID_MD_PORT_ENUM] |=
+ FIELD_PREP(FEATURE_MSK, MTK_FEATURE_MUST_BE_SUPPORTED);
++
++ INIT_WORK(&md->ap_handshake_work, t7xx_ap_hk_wq);
++ md->core_ap.feature_set[RT_ID_AP_PORT_ENUM] &= ~FEATURE_MSK;
++ md->core_ap.feature_set[RT_ID_AP_PORT_ENUM] |=
++ FIELD_PREP(FEATURE_MSK, MTK_FEATURE_MUST_BE_SUPPORTED);
++
+ return md;
+ }
+
+@@ -640,6 +673,7 @@ int t7xx_md_reset(struct t7xx_pci_dev *t7xx_dev)
+ md->exp_id = 0;
+ t7xx_fsm_reset(md);
+ t7xx_cldma_reset(md->md_ctrl[CLDMA_ID_MD]);
++ t7xx_cldma_reset(md->md_ctrl[CLDMA_ID_AP]);
+ t7xx_port_proxy_reset(md->port_prox);
+ md->md_init_finish = true;
+ return t7xx_core_reset(md);
+@@ -669,6 +703,10 @@ int t7xx_md_init(struct t7xx_pci_dev *t7xx_dev)
+ if (ret)
+ goto err_destroy_hswq;
+
++ ret = t7xx_cldma_alloc(CLDMA_ID_AP, t7xx_dev);
++ if (ret)
++ goto err_destroy_hswq;
++
+ ret = t7xx_fsm_init(md);
+ if (ret)
+ goto err_destroy_hswq;
+@@ -681,12 +719,16 @@ int t7xx_md_init(struct t7xx_pci_dev *t7xx_dev)
+ if (ret)
+ goto err_uninit_ccmni;
+
+- ret = t7xx_port_proxy_init(md);
++ ret = t7xx_cldma_init(md->md_ctrl[CLDMA_ID_AP]);
+ if (ret)
+ goto err_uninit_md_cldma;
+
++ ret = t7xx_port_proxy_init(md);
++ if (ret)
++ goto err_uninit_ap_cldma;
++
+ ret = t7xx_fsm_append_cmd(md->fsm_ctl, FSM_CMD_START, 0);
+- if (ret) /* fsm_uninit flushes cmd queue */
++ if (ret) /* t7xx_fsm_uninit() flushes cmd queue */
+ goto err_uninit_proxy;
+
+ t7xx_md_sys_sw_init(t7xx_dev);
+@@ -696,6 +738,9 @@ int t7xx_md_init(struct t7xx_pci_dev *t7xx_dev)
+ err_uninit_proxy:
+ t7xx_port_proxy_uninit(md->port_prox);
+
++err_uninit_ap_cldma:
++ t7xx_cldma_exit(md->md_ctrl[CLDMA_ID_AP]);
++
+ err_uninit_md_cldma:
+ t7xx_cldma_exit(md->md_ctrl[CLDMA_ID_MD]);
+
+@@ -722,6 +767,7 @@ void t7xx_md_exit(struct t7xx_pci_dev *t7xx_dev)
+
+ t7xx_fsm_append_cmd(md->fsm_ctl, FSM_CMD_PRE_STOP, FSM_CMD_FLAG_WAIT_FOR_COMPLETION);
+ t7xx_port_proxy_uninit(md->port_prox);
++ t7xx_cldma_exit(md->md_ctrl[CLDMA_ID_AP]);
+ t7xx_cldma_exit(md->md_ctrl[CLDMA_ID_MD]);
+ t7xx_ccmni_exit(t7xx_dev);
+ t7xx_fsm_uninit(md);
+diff --git a/drivers/net/wwan/t7xx/t7xx_modem_ops.h b/drivers/net/wwan/t7xx/t7xx_modem_ops.h
+index 7469ed636ae8..abe633cf7adc 100644
+--- a/drivers/net/wwan/t7xx/t7xx_modem_ops.h
++++ b/drivers/net/wwan/t7xx/t7xx_modem_ops.h
+@@ -66,10 +66,12 @@ struct t7xx_modem {
+ struct cldma_ctrl *md_ctrl[CLDMA_NUM];
+ struct t7xx_pci_dev *t7xx_dev;
+ struct t7xx_sys_info core_md;
++ struct t7xx_sys_info core_ap;
+ bool md_init_finish;
+ bool rgu_irq_asserted;
+ struct workqueue_struct *handshake_wq;
+ struct work_struct handshake_work;
++ struct work_struct ap_handshake_work;
+ struct t7xx_fsm_ctl *fsm_ctl;
+ struct port_proxy *port_prox;
+ unsigned int exp_id;
+diff --git a/drivers/net/wwan/t7xx/t7xx_port.h b/drivers/net/wwan/t7xx/t7xx_port.h
+index 8ea9079af997..4ae8a00a8532 100644
+--- a/drivers/net/wwan/t7xx/t7xx_port.h
++++ b/drivers/net/wwan/t7xx/t7xx_port.h
+@@ -36,9 +36,13 @@
+ /* Channel ID and Message ID definitions.
+ * The channel number consists of peer_id(15:12) , channel_id(11:0)
+ * peer_id:
+- * 0:reserved, 1: to sAP, 2: to MD
++ * 0:reserved, 1: to AP, 2: to MD
+ */
+ enum port_ch {
++ /* to AP */
++ PORT_CH_AP_CONTROL_RX = 0x1000,
++ PORT_CH_AP_CONTROL_TX = 0x1001,
++
+ /* to MD */
+ PORT_CH_CONTROL_RX = 0x2000,
+ PORT_CH_CONTROL_TX = 0x2001,
+diff --git a/drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c b/drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c
+index 68430b130a67..ae632ef96698 100644
+--- a/drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c
++++ b/drivers/net/wwan/t7xx/t7xx_port_ctrl_msg.c
+@@ -167,8 +167,12 @@ static int control_msg_handler(struct t7xx_port *port, struct sk_buff *skb)
+ case CTL_ID_HS2_MSG:
+ skb_pull(skb, sizeof(*ctrl_msg_h));
+
+- if (port_conf->rx_ch == PORT_CH_CONTROL_RX) {
+- ret = t7xx_fsm_append_event(ctl, FSM_EVENT_MD_HS2, skb->data,
++ if (port_conf->rx_ch == PORT_CH_CONTROL_RX ||
++ port_conf->rx_ch == PORT_CH_AP_CONTROL_RX) {
++ int event = port_conf->rx_ch == PORT_CH_CONTROL_RX ?
++ FSM_EVENT_MD_HS2 : FSM_EVENT_AP_HS2;
++
++ ret = t7xx_fsm_append_event(ctl, event, skb->data,
+ le32_to_cpu(ctrl_msg_h->data_length));
+ if (ret)
+ dev_err(port->dev, "Failed to append Handshake 2 event");
+diff --git a/drivers/net/wwan/t7xx/t7xx_port_proxy.c b/drivers/net/wwan/t7xx/t7xx_port_proxy.c
+index 894b1d11b2c9..274846d39fbf 100644
+--- a/drivers/net/wwan/t7xx/t7xx_port_proxy.c
++++ b/drivers/net/wwan/t7xx/t7xx_port_proxy.c
+@@ -48,7 +48,7 @@
+ i < (proxy)->port_count; \
+ i++, (p) = &(proxy)->ports[i])
+
+-static const struct t7xx_port_conf t7xx_md_port_conf[] = {
++static const struct t7xx_port_conf t7xx_port_conf[] = {
+ {
+ .tx_ch = PORT_CH_UART2_TX,
+ .rx_ch = PORT_CH_UART2_RX,
+@@ -89,6 +89,14 @@ static const struct t7xx_port_conf t7xx_md_port_conf[] = {
+ .path_id = CLDMA_ID_MD,
+ .ops = &ctl_port_ops,
+ .name = "t7xx_ctrl",
++ }, {
++ .tx_ch = PORT_CH_AP_CONTROL_TX,
++ .rx_ch = PORT_CH_AP_CONTROL_RX,
++ .txq_index = Q_IDX_CTRL,
++ .rxq_index = Q_IDX_CTRL,
++ .path_id = CLDMA_ID_AP,
++ .ops = &ctl_port_ops,
++ .name = "t7xx_ap_ctrl",
+ },
+ };
+
+@@ -428,6 +436,9 @@ static void t7xx_proxy_init_all_ports(struct t7xx_modem *md)
+ if (port_conf->tx_ch == PORT_CH_CONTROL_TX)
+ md->core_md.ctl_port = port;
+
++ if (port_conf->tx_ch == PORT_CH_AP_CONTROL_TX)
++ md->core_ap.ctl_port = port;
++
+ port->t7xx_dev = md->t7xx_dev;
+ port->dev = &md->t7xx_dev->pdev->dev;
+ spin_lock_init(&port->port_update_lock);
+@@ -442,7 +453,7 @@ static void t7xx_proxy_init_all_ports(struct t7xx_modem *md)
+
+ static int t7xx_proxy_alloc(struct t7xx_modem *md)
+ {
+- unsigned int port_count = ARRAY_SIZE(t7xx_md_port_conf);
++ unsigned int port_count = ARRAY_SIZE(t7xx_port_conf);
+ struct device *dev = &md->t7xx_dev->pdev->dev;
+ struct port_proxy *port_prox;
+ int i;
+@@ -456,7 +467,7 @@ static int t7xx_proxy_alloc(struct t7xx_modem *md)
+ port_prox->dev = dev;
+
+ for (i = 0; i < port_count; i++)
+- port_prox->ports[i].port_conf = &t7xx_md_port_conf[i];
++ port_prox->ports[i].port_conf = &t7xx_port_conf[i];
+
+ port_prox->port_count = port_count;
+ t7xx_proxy_init_all_ports(md);
+@@ -481,6 +492,7 @@ int t7xx_port_proxy_init(struct t7xx_modem *md)
+ if (ret)
+ return ret;
+
++ t7xx_cldma_set_recv_skb(md->md_ctrl[CLDMA_ID_AP], t7xx_port_proxy_recv_skb);
+ t7xx_cldma_set_recv_skb(md->md_ctrl[CLDMA_ID_MD], t7xx_port_proxy_recv_skb);
+ return 0;
+ }
+diff --git a/drivers/net/wwan/t7xx/t7xx_reg.h b/drivers/net/wwan/t7xx/t7xx_reg.h
+index 7c1b81091a0f..c41d7d094c08 100644
+--- a/drivers/net/wwan/t7xx/t7xx_reg.h
++++ b/drivers/net/wwan/t7xx/t7xx_reg.h
+@@ -56,7 +56,7 @@
+ #define D2H_INT_RESUME_ACK BIT(12)
+ #define D2H_INT_SUSPEND_ACK_AP BIT(13)
+ #define D2H_INT_RESUME_ACK_AP BIT(14)
+-#define D2H_INT_ASYNC_SAP_HK BIT(15)
++#define D2H_INT_ASYNC_AP_HK BIT(15)
+ #define D2H_INT_ASYNC_MD_HK BIT(16)
+
+ /* Register base */
+diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.c b/drivers/net/wwan/t7xx/t7xx_state_monitor.c
+index 0bcca08ff2bd..80edb8e75a6a 100644
+--- a/drivers/net/wwan/t7xx/t7xx_state_monitor.c
++++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.c
+@@ -285,8 +285,9 @@ static int fsm_routine_starting(struct t7xx_fsm_ctl *ctl)
+ t7xx_fsm_broadcast_state(ctl, MD_STATE_WAITING_FOR_HS1);
+ t7xx_md_event_notify(md, FSM_START);
+
+- wait_event_interruptible_timeout(ctl->async_hk_wq, md->core_md.ready || ctl->exp_flg,
+- HZ * 60);
++ wait_event_interruptible_timeout(ctl->async_hk_wq,
++ (md->core_md.ready && md->core_ap.ready) ||
++ ctl->exp_flg, HZ * 60);
+ dev = &md->t7xx_dev->pdev->dev;
+
+ if (ctl->exp_flg)
+@@ -297,6 +298,13 @@ static int fsm_routine_starting(struct t7xx_fsm_ctl *ctl)
+ if (md->core_md.handshake_ongoing)
+ t7xx_fsm_append_event(ctl, FSM_EVENT_MD_HS2_EXIT, NULL, 0);
+
++ fsm_routine_exception(ctl, NULL, EXCEPTION_HS_TIMEOUT);
++ return -ETIMEDOUT;
++ } else if (!md->core_ap.ready) {
++ dev_err(dev, "AP handshake timeout\n");
++ if (md->core_ap.handshake_ongoing)
++ t7xx_fsm_append_event(ctl, FSM_EVENT_AP_HS2_EXIT, NULL, 0);
++
+ fsm_routine_exception(ctl, NULL, EXCEPTION_HS_TIMEOUT);
+ return -ETIMEDOUT;
+ }
+@@ -335,6 +343,7 @@ static void fsm_routine_start(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_command
+ return;
+ }
+
++ t7xx_cldma_hif_hw_init(md->md_ctrl[CLDMA_ID_AP]);
+ t7xx_cldma_hif_hw_init(md->md_ctrl[CLDMA_ID_MD]);
+ fsm_finish_command(ctl, cmd, fsm_routine_starting(ctl));
+ }
+diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.h b/drivers/net/wwan/t7xx/t7xx_state_monitor.h
+index b1af0259d4c5..b6e76f3903c8 100644
+--- a/drivers/net/wwan/t7xx/t7xx_state_monitor.h
++++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.h
+@@ -38,10 +38,12 @@ enum t7xx_fsm_state {
+ enum t7xx_fsm_event_state {
+ FSM_EVENT_INVALID,
+ FSM_EVENT_MD_HS2,
++ FSM_EVENT_AP_HS2,
+ FSM_EVENT_MD_EX,
+ FSM_EVENT_MD_EX_REC_OK,
+ FSM_EVENT_MD_EX_PASS,
+ FSM_EVENT_MD_HS2_EXIT,
++ FSM_EVENT_AP_HS2_EXIT,
+ FSM_EVENT_MAX
+ };
+
+--
+2.42.0
+
diff --git a/0010-nvme-avoid-bogus-CRTO-values.patch b/0010-nvme-avoid-bogus-CRTO-values.patch
new file mode 100644
index 000000000000..8f0ec64378b8
--- /dev/null
+++ b/0010-nvme-avoid-bogus-CRTO-values.patch
@@ -0,0 +1,108 @@
+From 77903a65f87e3abd99082700a144b0f40f8fd029 Mon Sep 17 00:00:00 2001
+From: Keith Busch <kbusch@kernel.org>
+Date: Tue, 12 Sep 2023 14:38:58 -0700
+Subject: [PATCH 10/12] nvme: avoid bogus CRTO values
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit 6cc834ba62998c65c42d0c63499bdd35067151ec upstream.
+
+Some devices are reporting controller ready mode support, but return 0
+for CRTO. These devices require a much higher time to ready than that,
+so they are failing to initialize after the driver starter preferring
+that value over CAP.TO.
+
+The spec requires that CAP.TO match the appropritate CRTO value, or be
+set to 0xff if CRTO is larger than that. This means that CAP.TO can be
+used to validate if CRTO is reliable, and provides an appropriate
+fallback for setting the timeout value if not. Use whichever is larger.
+
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=217863
+Reported-by: Cláudio Sampaio <patola@gmail.com>
+Reported-by: Felix Yan <felixonmars@archlinux.org>
+Tested-by: Felix Yan <felixonmars@archlinux.org>
+Based-on-a-patch-by: Felix Yan <felixonmars@archlinux.org>
+Cc: stable@vger.kernel.org
+Signed-off-by: Keith Busch <kbusch@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cherry-picked-for: https://bugs.archlinux.org/task/79695
+---
+ drivers/nvme/host/core.c | 54 ++++++++++++++++++++++++++--------------
+ 1 file changed, 35 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
+index f3a01b79148c..21783aa2ee8e 100644
+--- a/drivers/nvme/host/core.c
++++ b/drivers/nvme/host/core.c
+@@ -2245,25 +2245,8 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
+ else
+ ctrl->ctrl_config = NVME_CC_CSS_NVM;
+
+- if (ctrl->cap & NVME_CAP_CRMS_CRWMS) {
+- u32 crto;
+-
+- ret = ctrl->ops->reg_read32(ctrl, NVME_REG_CRTO, &crto);
+- if (ret) {
+- dev_err(ctrl->device, "Reading CRTO failed (%d)\n",
+- ret);
+- return ret;
+- }
+-
+- if (ctrl->cap & NVME_CAP_CRMS_CRIMS) {
+- ctrl->ctrl_config |= NVME_CC_CRIME;
+- timeout = NVME_CRTO_CRIMT(crto);
+- } else {
+- timeout = NVME_CRTO_CRWMT(crto);
+- }
+- } else {
+- timeout = NVME_CAP_TIMEOUT(ctrl->cap);
+- }
++ if (ctrl->cap & NVME_CAP_CRMS_CRWMS && ctrl->cap & NVME_CAP_CRMS_CRIMS)
++ ctrl->ctrl_config |= NVME_CC_CRIME;
+
+ ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
+ ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE;
+@@ -2277,6 +2260,39 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
+ if (ret)
+ return ret;
+
++ /* CAP value may change after initial CC write */
++ ret = ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &ctrl->cap);
++ if (ret)
++ return ret;
++
++ timeout = NVME_CAP_TIMEOUT(ctrl->cap);
++ if (ctrl->cap & NVME_CAP_CRMS_CRWMS) {
++ u32 crto, ready_timeout;
++
++ ret = ctrl->ops->reg_read32(ctrl, NVME_REG_CRTO, &crto);
++ if (ret) {
++ dev_err(ctrl->device, "Reading CRTO failed (%d)\n",
++ ret);
++ return ret;
++ }
++
++ /*
++ * CRTO should always be greater or equal to CAP.TO, but some
++ * devices are known to get this wrong. Use the larger of the
++ * two values.
++ */
++ if (ctrl->ctrl_config & NVME_CC_CRIME)
++ ready_timeout = NVME_CRTO_CRIMT(crto);
++ else
++ ready_timeout = NVME_CRTO_CRWMT(crto);
++
++ if (ready_timeout < timeout)
++ dev_warn_once(ctrl->device, "bad crto:%x cap:%llx\n",
++ crto, ctrl->cap);
++ else
++ timeout = ready_timeout;
++ }
++
+ ctrl->ctrl_config |= NVME_CC_ENABLE;
+ ret = ctrl->ops->reg_write32(ctrl, NVME_REG_CC, ctrl->ctrl_config);
+ if (ret)
+--
+2.42.0
+
diff --git a/0011-Revert-101bd907b424-misc-rtsx-judge-ASPM-Mode-to-set.patch b/0011-Revert-101bd907b424-misc-rtsx-judge-ASPM-Mode-to-set.patch
new file mode 100644
index 000000000000..4c30035209f4
--- /dev/null
+++ b/0011-Revert-101bd907b424-misc-rtsx-judge-ASPM-Mode-to-set.patch
@@ -0,0 +1,193 @@
+From 595d88a664dc1e7aa175768b8812046265c6de4a Mon Sep 17 00:00:00 2001
+From: Michal Suchanek <msuchanek@suse.de>
+Date: Wed, 23 Aug 2023 11:02:33 +0200
+Subject: [PATCH 11/12] Revert 101bd907b424 ("misc: rtsx: judge ASPM Mode to
+ set PETXCFG Reg")
+
+References: boo#1214428 boo#1214397
+Patch-mainline: Not yet, fix under discussion
+
+Causes inability to access Samsung NVMe drives.
+
+Source: https://bugzilla.kernel.org/show_bug.cgi?id=217802#c18
+Cherry-picked-for: https://bugs.archlinux.org/task/79439
+---
+ drivers/misc/cardreader/rts5227.c | 2 +-
+ drivers/misc/cardreader/rts5228.c | 18 ++++++++++++++++++
+ drivers/misc/cardreader/rts5249.c | 3 ++-
+ drivers/misc/cardreader/rts5260.c | 18 ++++++++++++++++++
+ drivers/misc/cardreader/rts5261.c | 18 ++++++++++++++++++
+ drivers/misc/cardreader/rtsx_pcr.c | 5 +----
+ 6 files changed, 58 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/misc/cardreader/rts5227.c b/drivers/misc/cardreader/rts5227.c
+index 3dae5e3a1697..d676cf63a966 100644
+--- a/drivers/misc/cardreader/rts5227.c
++++ b/drivers/misc/cardreader/rts5227.c
+@@ -195,7 +195,7 @@ static int rts5227_extra_init_hw(struct rtsx_pcr *pcr)
+ }
+ }
+
+- if (option->force_clkreq_0 && pcr->aspm_mode == ASPM_MODE_CFG)
++ if (option->force_clkreq_0)
+ rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG,
+ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
+ else
+diff --git a/drivers/misc/cardreader/rts5228.c b/drivers/misc/cardreader/rts5228.c
+index f4ab09439da7..cfebad51d1d8 100644
+--- a/drivers/misc/cardreader/rts5228.c
++++ b/drivers/misc/cardreader/rts5228.c
+@@ -435,10 +435,17 @@ static void rts5228_init_from_cfg(struct rtsx_pcr *pcr)
+ option->ltr_enabled = false;
+ }
+ }
++
++ if (rtsx_check_dev_flag(pcr, ASPM_L1_1_EN | ASPM_L1_2_EN
++ | PM_L1_1_EN | PM_L1_2_EN))
++ option->force_clkreq_0 = false;
++ else
++ option->force_clkreq_0 = true;
+ }
+
+ static int rts5228_extra_init_hw(struct rtsx_pcr *pcr)
+ {
++ struct rtsx_cr_option *option = &pcr->option;
+
+ rtsx_pci_write_register(pcr, RTS5228_AUTOLOAD_CFG1,
+ CD_RESUME_EN_MASK, CD_RESUME_EN_MASK);
+@@ -469,6 +476,17 @@ static int rts5228_extra_init_hw(struct rtsx_pcr *pcr)
+ else
+ rtsx_pci_write_register(pcr, PETXCFG, 0x30, 0x00);
+
++ /*
++ * If u_force_clkreq_0 is enabled, CLKREQ# PIN will be forced
++ * to drive low, and we forcibly request clock.
++ */
++ if (option->force_clkreq_0)
++ rtsx_pci_write_register(pcr, PETXCFG,
++ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
++ else
++ rtsx_pci_write_register(pcr, PETXCFG,
++ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
++
+ rtsx_pci_write_register(pcr, PWD_SUSPEND_EN, 0xFF, 0xFB);
+
+ if (pcr->rtd3_en) {
+diff --git a/drivers/misc/cardreader/rts5249.c b/drivers/misc/cardreader/rts5249.c
+index 47ab72a43256..91d240dd68fa 100644
+--- a/drivers/misc/cardreader/rts5249.c
++++ b/drivers/misc/cardreader/rts5249.c
+@@ -327,11 +327,12 @@ static int rts5249_extra_init_hw(struct rtsx_pcr *pcr)
+ }
+ }
+
++
+ /*
+ * If u_force_clkreq_0 is enabled, CLKREQ# PIN will be forced
+ * to drive low, and we forcibly request clock.
+ */
+- if (option->force_clkreq_0 && pcr->aspm_mode == ASPM_MODE_CFG)
++ if (option->force_clkreq_0)
+ rtsx_pci_write_register(pcr, PETXCFG,
+ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
+ else
+diff --git a/drivers/misc/cardreader/rts5260.c b/drivers/misc/cardreader/rts5260.c
+index 79b18f6f73a8..9b42b20a3e5a 100644
+--- a/drivers/misc/cardreader/rts5260.c
++++ b/drivers/misc/cardreader/rts5260.c
+@@ -517,10 +517,17 @@ static void rts5260_init_from_cfg(struct rtsx_pcr *pcr)
+ option->ltr_enabled = false;
+ }
+ }
++
++ if (rtsx_check_dev_flag(pcr, ASPM_L1_1_EN | ASPM_L1_2_EN
++ | PM_L1_1_EN | PM_L1_2_EN))
++ option->force_clkreq_0 = false;
++ else
++ option->force_clkreq_0 = true;
+ }
+
+ static int rts5260_extra_init_hw(struct rtsx_pcr *pcr)
+ {
++ struct rtsx_cr_option *option = &pcr->option;
+
+ /* Set mcu_cnt to 7 to ensure data can be sampled properly */
+ rtsx_pci_write_register(pcr, 0xFC03, 0x7F, 0x07);
+@@ -539,6 +546,17 @@ static int rts5260_extra_init_hw(struct rtsx_pcr *pcr)
+
+ rts5260_init_hw(pcr);
+
++ /*
++ * If u_force_clkreq_0 is enabled, CLKREQ# PIN will be forced
++ * to drive low, and we forcibly request clock.
++ */
++ if (option->force_clkreq_0)
++ rtsx_pci_write_register(pcr, PETXCFG,
++ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
++ else
++ rtsx_pci_write_register(pcr, PETXCFG,
++ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
++
+ rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x10, 0x00);
+
+ return 0;
+diff --git a/drivers/misc/cardreader/rts5261.c b/drivers/misc/cardreader/rts5261.c
+index 94af6bf8a25a..b1e76030cafd 100644
+--- a/drivers/misc/cardreader/rts5261.c
++++ b/drivers/misc/cardreader/rts5261.c
+@@ -498,10 +498,17 @@ static void rts5261_init_from_cfg(struct rtsx_pcr *pcr)
+ option->ltr_enabled = false;
+ }
+ }
++
++ if (rtsx_check_dev_flag(pcr, ASPM_L1_1_EN | ASPM_L1_2_EN
++ | PM_L1_1_EN | PM_L1_2_EN))
++ option->force_clkreq_0 = false;
++ else
++ option->force_clkreq_0 = true;
+ }
+
+ static int rts5261_extra_init_hw(struct rtsx_pcr *pcr)
+ {
++ struct rtsx_cr_option *option = &pcr->option;
+ u32 val;
+
+ rtsx_pci_write_register(pcr, RTS5261_AUTOLOAD_CFG1,
+@@ -547,6 +554,17 @@ static int rts5261_extra_init_hw(struct rtsx_pcr *pcr)
+ else
+ rtsx_pci_write_register(pcr, PETXCFG, 0x30, 0x00);
+
++ /*
++ * If u_force_clkreq_0 is enabled, CLKREQ# PIN will be forced
++ * to drive low, and we forcibly request clock.
++ */
++ if (option->force_clkreq_0)
++ rtsx_pci_write_register(pcr, PETXCFG,
++ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
++ else
++ rtsx_pci_write_register(pcr, PETXCFG,
++ FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
++
+ rtsx_pci_write_register(pcr, PWD_SUSPEND_EN, 0xFF, 0xFB);
+
+ if (pcr->rtd3_en) {
+diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c
+index a3f4b52bb159..32b7783e9d4f 100644
+--- a/drivers/misc/cardreader/rtsx_pcr.c
++++ b/drivers/misc/cardreader/rtsx_pcr.c
+@@ -1326,11 +1326,8 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)
+ return err;
+ }
+
+- if (pcr->aspm_mode == ASPM_MODE_REG) {
++ if (pcr->aspm_mode == ASPM_MODE_REG)
+ rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, 0x30, 0x30);
+- rtsx_pci_write_register(pcr, PETXCFG,
+- FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
+- }
+
+ /* No CD interrupt if probing driver with card inserted.
+ * So we need to initialize pcr->card_exist here.
+--
+2.42.0
+
diff --git a/PKGBUILD b/PKGBUILD
index c6226cee7792..01cdec71e373 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -72,7 +72,7 @@ _subarch=
### IMPORTANT: Do no edit below this line unless you know what you're doing
pkgbase=linux-ck
pkgver=6.5.4
-pkgrel=1
+pkgrel=2
arch=(x86_64)
url="https://wiki.archlinux.org/index.php/Linux-ck"
license=(GPL2)
@@ -109,6 +109,10 @@ source=(
0005-btrfs-set-last-dir-index-to-the-current-last-index-w.patch
0006-btrfs-refresh-dir-last-index-during-a-rewinddir-3-ca.patch
0007-btrfs-fix-race-between-reading-a-directory-and-addin.patch
+ 0008-i915-Limit-the-length-of-an-sg-list-to-the-requested.patch
+ 0009-net-wwan-t7xx-Add-AP-CLDMA.patch
+ 0010-nvme-avoid-bogus-CRTO-values.patch
+ 0011-Revert-101bd907b424-misc-rtsx-judge-ASPM-Mode-to-set.patch
)
validpgpkeys=(
ABAF11C65A2970B130ABE3C479BE3E4300411886 # Linus Torvalds
@@ -119,17 +123,17 @@ sha256sums=('bdf76c15229b241e578046b8486106f09534d754ea4cbf105e0660e551fb1669'
'46451dbc3305d4c2e726a2f1943bddf697c5bb6815d93e5baed80bca82e53fdc'
'f1d586e111932890ad5e0df15d092fb9b3f87bae4ea17812aae9b0ec98fe2db0'
'a86a59d089ddd4f31565ff6a27ba74f4697ffa0ab0f57dc839e1da6ab83d77a4'
- 'bbf2c993e10c1a59b48a7d05075b9593ebffc4196fd7f748d12e6823de3a94a9'
- 'c9ed33e551bc45617ce9331da43535bc3af3ff20553561d5b8a5d3f4265a65c1'
- '5627f3cf0e65f9d269d30d3e2380582fdaa74b0b5322e14389988a5ce8328ab5'
- 'a3633a05054e68196ebf7654692cc30554198e88e2f54c3440cb7f64600cb0d5'
- '97da17e086d39aff622c7b17dfc169ddd50c62691274d15b4505c8b79238c829'
- '5caecd368e426c8429107f3db84cd39e4f3b2d2cfa2ae665234704367f5190c0'
- '1e8c0474375e798ef538efc3cb3e5f6a72b820d98f4f0b620008fda60b8a18d6')
-_make() {
- test -s version
- make KERNELRELEASE="$(<version)" "$@"
-}
+ 'e83c0dfa73fafb09b24a38e0c62767515177ae8e29eb511592f0af0083a08a97'
+ '0fbc4ce4428ac446752dc192709c21764018abf03046402ddd27409f2fac7172'
+ '8cac889e375641832fdc68eddd16e7c2febe0207cd117710d0d1876270afd4c7'
+ '36ad01102f1005d855c5e0c9d6b91e2b24654e7e971a32c1f3acb6a59bf4b270'
+ '32da7426bb107b29835ce45322ca40fb0c1c56f90574bec8e8fc9b94f5255220'
+ '5208324060bc7ac4d418a5503763f6f0f7e99c79b83216ebfde4ac778942bf66'
+ 'fc655539835f8910841da651c46f4d709c6d82cf578066e0c5c25c0588228aee'
+ 'ec8a7654fc9900923b85f2876e61e8bd7bffe9c8a85ee07b3cb7af47b01dc578'
+ '30c1656ae0776a769373eb3dca9587e398d5a05517bfa30a3c1573861ad4b155'
+ '96babd7c1ab75f4b5d2b512cbb105857242419ac1fc5bc41a207fd95a99f4b35'
+ '5376296a6c24bfdcb7f6f5f0eddb5dd9a12dedfbeb92d4fe6185828db9988494')
prepare() {
cd linux-${pkgver}
@@ -137,14 +141,12 @@ prepare() {
msg2 "Setting version..."
echo "-$pkgrel" > localversion.10-pkgrel
echo "${pkgbase#linux}" > localversion.20-pkgname
- make defconfig
- make -s kernelrelease > version
- make mrproper
local src
for src in "${source[@]}"; do
src="${src%%::*}"
src="${src##*/}"
+ src="${src%.zst}"
[[ $src = 0*.patch ]] || continue
echo "Applying patch $src..."
patch -Np1 < "../$src"
@@ -210,6 +212,7 @@ prepare() {
fi
fi
+ make -s kernelrelease > version
echo "Prepared $pkgbase version $(<version)"
[[ -z "$_makenconfig" ]] || make LLVM=$_LLVM LLVM_IAS=$_LLVM nconfig
@@ -264,7 +267,7 @@ _package() {
echo "$pkgbase" | install -Dm644 /dev/stdin "$modulesdir/pkgbase"
echo "Installing modules..."
- ZSTD_CLEVEL=19 _make LLVM=$_LLVM LLVM_IAS=$_LLVM INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 \
+ ZSTD_CLEVEL=19 make LLVM=$_LLVM LLVM_IAS=$_LLVM INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 \
DEPMOD=/doesnt/exist modules_install # Suppress depmod
# remove build and source links