+++ /dev/null
-From 8766e406adb9b3c4bd8c0506a71bbbf99a43906d Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 12 Jul 2025 02:08:03 -0400
-Subject: Bluetooth: HCI: Set extended advertising data synchronously
-
-From: Christian Eggers <ceggers@arri.de>
-
-[ Upstream commit 89fb8acc38852116d38d721ad394aad7f2871670 ]
-
-Currently, for controllers with extended advertising, the advertising
-data is set in the asynchronous response handler for extended
-adverstising params. As most advertising settings are performed in a
-synchronous context, the (asynchronous) setting of the advertising data
-is done too late (after enabling the advertising).
-
-Move setting of adverstising data from asynchronous response handler
-into synchronous context to fix ordering of HCI commands.
-
-Signed-off-by: Christian Eggers <ceggers@arri.de>
-Fixes: a0fb3726ba55 ("Bluetooth: Use Set ext adv/scan rsp data if controller supports")
-Cc: stable@vger.kernel.org
-v2: https://lore.kernel.org/linux-bluetooth/20250626115209.17839-1-ceggers@arri.de/
-Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/bluetooth/hci_event.c | 33 ---------------------------------
- net/bluetooth/hci_request.c | 3 +++
- 2 files changed, 3 insertions(+), 33 deletions(-)
-
-diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
-index 7f26c1aab9a06..2cc4aaba09abe 100644
---- a/net/bluetooth/hci_event.c
-+++ b/net/bluetooth/hci_event.c
-@@ -1726,36 +1726,6 @@ static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
- hci_dev_unlock(hdev);
- }
-
--static void hci_cc_set_ext_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
--{
-- struct hci_rp_le_set_ext_adv_params *rp = (void *) skb->data;
-- struct hci_cp_le_set_ext_adv_params *cp;
-- struct adv_info *adv_instance;
--
-- BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
--
-- if (rp->status)
-- return;
--
-- cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS);
-- if (!cp)
-- return;
--
-- hci_dev_lock(hdev);
-- hdev->adv_addr_type = cp->own_addr_type;
-- if (!hdev->cur_adv_instance) {
-- /* Store in hdev for instance 0 */
-- hdev->adv_tx_power = rp->tx_power;
-- } else {
-- adv_instance = hci_find_adv_instance(hdev,
-- hdev->cur_adv_instance);
-- if (adv_instance)
-- adv_instance->tx_power = rp->tx_power;
-- }
-- /* Update adv data as tx power is known now */
-- hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
-- hci_dev_unlock(hdev);
--}
-
- static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
- {
-@@ -3601,9 +3571,6 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
- hci_cc_le_read_num_adv_sets(hdev, skb);
- break;
-
-- case HCI_OP_LE_SET_EXT_ADV_PARAMS:
-- hci_cc_set_ext_adv_param(hdev, skb);
-- break;
-
- case HCI_OP_LE_SET_EXT_ADV_ENABLE:
- hci_cc_le_set_ext_adv_enable(hdev, skb);
-diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
-index 7ce6db1ac558a..743ba58941f8b 100644
---- a/net/bluetooth/hci_request.c
-+++ b/net/bluetooth/hci_request.c
-@@ -2179,6 +2179,9 @@ int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance)
-
- hci_req_add(req, HCI_OP_LE_SET_EXT_ADV_PARAMS, sizeof(cp), &cp);
-
-+ /* Update adv data after setting ext adv params */
-+ __hci_req_update_adv_data(req, instance);
-+
- if (own_addr_type == ADDR_LE_DEV_RANDOM &&
- bacmp(&random_addr, BDADDR_ANY)) {
- struct hci_cp_le_set_adv_set_rand_addr cp;
---
-2.39.5
-
+++ /dev/null
-From e15b371eabf4c0fe7cff14155cb392813ab5709a Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 18 Jun 2025 15:58:31 +0100
-Subject: btrfs: fix inode lookup error handling during log replay
-
-From: Filipe Manana <fdmanana@suse.com>
-
-[ Upstream commit 5f61b961599acbd2bed028d3089105a1f7d224b8 ]
-
-When replaying log trees we use read_one_inode() to get an inode, which is
-just a wrapper around btrfs_iget_logging(), which in turn is a wrapper for
-btrfs_iget(). But read_one_inode() always returns NULL for any error
-that btrfs_iget_logging() / btrfs_iget() may return and this is a problem
-because:
-
-1) In many callers of read_one_inode() we convert the NULL into -EIO,
- which is not accurate since btrfs_iget() may return -ENOMEM and -ENOENT
- for example, besides -EIO and other errors. So during log replay we
- may end up reporting a false -EIO, which is confusing since we may
- not have had any IO error at all;
-
-2) When replaying directory deletes, at replay_dir_deletes(), we assume
- the NULL returned from read_one_inode() means that the inode doesn't
- exist and then proceed as if no error had happened. This is wrong
- because unless btrfs_iget() returned ERR_PTR(-ENOENT), we had an
- actual error and the target inode may exist in the target subvolume
- root - this may later result in the log replay code failing at a
- later stage (if we are "lucky") or succeed but leaving some
- inconsistency in the filesystem.
-
-So fix this by not ignoring errors from btrfs_iget_logging() and as
-a consequence remove the read_one_inode() wrapper and just use
-btrfs_iget_logging() directly. Also since btrfs_iget_logging() is
-supposed to be called only against subvolume roots, just like
-read_one_inode() which had a comment about it, add an assertion to
-btrfs_iget_logging() to check that the target root corresponds to a
-subvolume root.
-
-Fixes: 5d4f98a28c7d ("Btrfs: Mixed back reference (FORWARD ROLLING FORMAT CHANGE)")
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Reviewed-by: Qu Wenruo <wqu@suse.com>
-Signed-off-by: Filipe Manana <fdmanana@suse.com>
-Signed-off-by: David Sterba <dsterba@suse.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/btrfs/tree-log.c | 153 ++++++++++++++++++++++++--------------------
- 1 file changed, 84 insertions(+), 69 deletions(-)
-
-diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
-index dd1c40019412c..503be060fa8f3 100644
---- a/fs/btrfs/tree-log.c
-+++ b/fs/btrfs/tree-log.c
-@@ -4,10 +4,12 @@
- */
-
- #include <linux/sched.h>
-+#include <linux/sched/mm.h>
- #include <linux/slab.h>
- #include <linux/blkdev.h>
- #include <linux/list_sort.h>
- #include <linux/iversion.h>
-+#include <linux/fscrypt.h>
- #include "misc.h"
- #include "ctree.h"
- #include "tree-log.h"
-@@ -129,6 +131,27 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
- * and once to do all the other items.
- */
-
-+static struct inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root)
-+{
-+ unsigned int nofs_flag;
-+ struct inode *inode;
-+
-+ /* Only meant to be called for subvolume roots and not for log roots. */
-+ ASSERT(is_fstree(root->root_key.objectid));
-+
-+ /*
-+ * We're holding a transaction handle whether we are logging or
-+ * replaying a log tree, so we must make sure NOFS semantics apply
-+ * because btrfs_alloc_inode() may be triggered and it uses GFP_KERNEL
-+ * to allocate an inode, which can recurse back into the filesystem and
-+ * attempt a transaction commit, resulting in a deadlock.
-+ */
-+ nofs_flag = memalloc_nofs_save();
-+ inode = btrfs_iget(root->fs_info->sb, objectid, root);
-+ memalloc_nofs_restore(nofs_flag);
-+
-+ return inode;
-+}
- /*
- * start a sub transaction and setup the log tree
- * this increments the log tree writer count to make the people
-@@ -543,20 +566,6 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans,
- return 0;
- }
-
--/*
-- * simple helper to read an inode off the disk from a given root
-- * This can only be called for subvolume roots and not for the log
-- */
--static noinline struct inode *read_one_inode(struct btrfs_root *root,
-- u64 objectid)
--{
-- struct inode *inode;
--
-- inode = btrfs_iget(root->fs_info->sb, objectid, root);
-- if (IS_ERR(inode))
-- inode = NULL;
-- return inode;
--}
-
- /* replays a single extent in 'eb' at 'slot' with 'key' into the
- * subvolume 'root'. path is released on entry and should be released
-@@ -610,11 +619,9 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
- goto out;
- }
-
-- inode = read_one_inode(root, key->objectid);
-- if (!inode) {
-- ret = -EIO;
-- goto out;
-- }
-+ inode = btrfs_iget_logging(key->objectid, root);
-+ if (IS_ERR(inode))
-+ return PTR_ERR(inode);
-
- /*
- * first check to see if we already have this extent in the
-@@ -871,9 +878,10 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
- read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len);
- btrfs_release_path(path);
-
-- inode = read_one_inode(root, location.objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(location.objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
-+ inode = NULL;
- goto out;
- }
-
-@@ -1115,10 +1123,10 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
- kfree(victim_name);
- return ret;
- } else if (!ret) {
-- ret = -ENOENT;
-- victim_parent = read_one_inode(root,
-- parent_objectid);
-- if (victim_parent) {
-+ victim_parent = btrfs_iget_logging(parent_objectid, root);
-+ if (IS_ERR(victim_parent)) {
-+ ret = PTR_ERR(victim_parent);
-+ } else {
- inc_nlink(&inode->vfs_inode);
- btrfs_release_path(path);
-
-@@ -1278,9 +1286,9 @@ static int unlink_old_inode_refs(struct btrfs_trans_handle *trans,
- struct inode *dir;
-
- btrfs_release_path(path);
-- dir = read_one_inode(root, parent_id);
-- if (!dir) {
-- ret = -ENOENT;
-+ dir = btrfs_iget_logging(parent_id, root);
-+ if (IS_ERR(dir)) {
-+ ret = PTR_ERR(dir);
- kfree(name);
- goto out;
- }
-@@ -1386,9 +1394,9 @@ static int add_link(struct btrfs_trans_handle *trans, struct btrfs_root *root,
- */
- btrfs_dir_item_key_to_cpu(path->nodes[0], dir_item, &key);
- btrfs_release_path(path);
-- other_inode = read_one_inode(root, key.objectid);
-- if (!other_inode) {
-- ret = -ENOENT;
-+ other_inode = btrfs_iget_logging(key.objectid, root);
-+ if (IS_ERR(other_inode)) {
-+ ret = PTR_ERR(other_inode);
- goto out;
- }
- ret = btrfs_unlink_inode(trans, root, BTRFS_I(dir), BTRFS_I(other_inode),
-@@ -1464,15 +1472,17 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
- * copy the back ref in. The link count fixup code will take
- * care of the rest
- */
-- dir = read_one_inode(root, parent_objectid);
-- if (!dir) {
-- ret = -ENOENT;
-+ dir = btrfs_iget_logging(parent_objectid, root);
-+ if (IS_ERR(dir)) {
-+ ret = PTR_ERR(dir);
-+ dir = NULL;
- goto out;
- }
-
-- inode = read_one_inode(root, inode_objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(inode_objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
-+ inode = NULL;
- goto out;
- }
-
-@@ -1484,11 +1494,13 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
- * parent object can change from one array
- * item to another.
- */
-- if (!dir)
-- dir = read_one_inode(root, parent_objectid);
- if (!dir) {
-- ret = -ENOENT;
-- goto out;
-+ dir = btrfs_iget_logging(parent_objectid, root);
-+ if (IS_ERR(dir)) {
-+ ret = PTR_ERR(dir);
-+ dir = NULL;
-+ goto out;
-+ }
- }
- } else {
- ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
-@@ -1807,9 +1819,9 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
- break;
-
- btrfs_release_path(path);
-- inode = read_one_inode(root, key.offset);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(key.offset, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
- break;
- }
-
-@@ -1844,9 +1856,9 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
- int ret = 0;
- struct inode *inode;
-
-- inode = read_one_inode(root, objectid);
-- if (!inode)
-- return -EIO;
-+ inode = btrfs_iget_logging(objectid, root);
-+ if (IS_ERR(inode))
-+ return PTR_ERR(inode);
-
- key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
- key.type = BTRFS_ORPHAN_ITEM_KEY;
-@@ -1884,14 +1896,14 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans,
- struct inode *dir;
- int ret;
-
-- inode = read_one_inode(root, location->objectid);
-- if (!inode)
-- return -ENOENT;
-+ inode = btrfs_iget_logging(location->objectid, root);
-+ if (IS_ERR(inode))
-+ return PTR_ERR(inode);
-
-- dir = read_one_inode(root, dirid);
-- if (!dir) {
-+ dir = btrfs_iget_logging(dirid, root);
-+ if (IS_ERR(dir)) {
- iput(inode);
-- return -EIO;
-+ return PTR_ERR(dir);
- }
-
- ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), name,
-@@ -1939,9 +1951,9 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
- bool update_size = (key->type == BTRFS_DIR_INDEX_KEY);
- bool name_added = false;
-
-- dir = read_one_inode(root, key->objectid);
-- if (!dir)
-- return -EIO;
-+ dir = btrfs_iget_logging(key->objectid, root);
-+ if (IS_ERR(dir))
-+ return PTR_ERR(dir);
-
- name_len = btrfs_dir_name_len(eb, di);
- name = kmalloc(name_len, GFP_NOFS);
-@@ -2287,10 +2299,10 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans,
- btrfs_dir_item_key_to_cpu(eb, di, &location);
- btrfs_release_path(path);
- btrfs_release_path(log_path);
-- inode = read_one_inode(root, location.objectid);
-- if (!inode) {
-+ inode = btrfs_iget_logging(location.objectid, root);
-+ if (IS_ERR(inode)) {
- kfree(name);
-- return -EIO;
-+ return PTR_ERR(inode);
- }
-
- ret = link_to_fixup_dir(trans, root,
-@@ -2466,14 +2478,17 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
- if (!log_path)
- return -ENOMEM;
-
-- dir = read_one_inode(root, dirid);
-- /* it isn't an error if the inode isn't there, that can happen
-- * because we replay the deletes before we copy in the inode item
-- * from the log
-+ dir = btrfs_iget_logging(dirid, root);
-+ /*
-+ * It isn't an error if the inode isn't there, that can happen because
-+ * we replay the deletes before we copy in the inode item from the log.
- */
-- if (!dir) {
-+ if (IS_ERR(dir)) {
- btrfs_free_path(log_path);
-- return 0;
-+ ret = PTR_ERR(dir);
-+ if (ret == -ENOENT)
-+ ret = 0;
-+ return ret;
- }
- again:
- range_start = 0;
-@@ -2633,9 +2648,9 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,
- struct inode *inode;
- u64 from;
-
-- inode = read_one_inode(root, key.objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(key.objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
- break;
- }
- from = ALIGN(i_size_read(inode),
---
-2.39.5
-
+++ /dev/null
-From 720a670541807bcc58302ef5309baead96c5b16f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 3 Feb 2022 22:44:43 +0100
-Subject: Revert "usb: host: xhci: mvebu: make USB 3.0 PHY optional for Armada
- 3720"
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Pali Rohár <pali@kernel.org>
-
-[ Upstream commit 8e10548f7f4814e530857d2049d6af6bc78add53 ]
-
-This reverts commit 3241929b67d28c83945d3191c6816a3271fd6b85.
-
-Armada 3720 phy driver (phy-mvebu-a3700-comphy.c) does not return
--EOPNOTSUPP from phy_power_on() callback anymore.
-
-So remove XHCI_SKIP_PHY_INIT flag from xhci_mvebu_a3700_plat_setup() and
-then also whole xhci_mvebu_a3700_plat_setup() function which is there just
-to handle -EOPNOTSUPP for XHCI_SKIP_PHY_INIT.
-
-xhci plat_setup callback is not used by any other xhci plat driver, so
-remove this callback completely.
-
-Signed-off-by: Pali Rohár <pali@kernel.org>
-Signed-off-by: Marek Behún <kabel@kernel.org>
-Acked-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Link: https://lore.kernel.org/r/20220203214444.1508-5-kabel@kernel.org
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-mvebu.c | 42 -----------------------------------
- drivers/usb/host/xhci-mvebu.h | 6 -----
- drivers/usb/host/xhci-plat.c | 20 +----------------
- drivers/usb/host/xhci-plat.h | 1 -
- 4 files changed, 1 insertion(+), 68 deletions(-)
-
-diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
-index eabccf25796b2..87f1597a0e5ab 100644
---- a/drivers/usb/host/xhci-mvebu.c
-+++ b/drivers/usb/host/xhci-mvebu.c
-@@ -8,7 +8,6 @@
- #include <linux/mbus.h>
- #include <linux/of.h>
- #include <linux/platform_device.h>
--#include <linux/phy/phy.h>
-
- #include <linux/usb.h>
- #include <linux/usb/hcd.h>
-@@ -75,47 +74,6 @@ int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
- return 0;
- }
-
--int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd)
--{
-- struct xhci_hcd *xhci = hcd_to_xhci(hcd);
-- struct device *dev = hcd->self.controller;
-- struct phy *phy;
-- int ret;
--
-- /* Old bindings miss the PHY handle */
-- phy = of_phy_get(dev->of_node, "usb3-phy");
-- if (IS_ERR(phy) && PTR_ERR(phy) == -EPROBE_DEFER)
-- return -EPROBE_DEFER;
-- else if (IS_ERR(phy))
-- goto phy_out;
--
-- ret = phy_init(phy);
-- if (ret)
-- goto phy_put;
--
-- ret = phy_set_mode(phy, PHY_MODE_USB_HOST_SS);
-- if (ret)
-- goto phy_exit;
--
-- ret = phy_power_on(phy);
-- if (ret == -EOPNOTSUPP) {
-- /* Skip initializatin of XHCI PHY when it is unsupported by firmware */
-- dev_warn(dev, "PHY unsupported by firmware\n");
-- xhci->quirks |= XHCI_SKIP_PHY_INIT;
-- }
-- if (ret)
-- goto phy_exit;
--
-- phy_power_off(phy);
--phy_exit:
-- phy_exit(phy);
--phy_put:
-- of_phy_put(phy);
--phy_out:
--
-- return 0;
--}
--
- int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
- {
- struct xhci_hcd *xhci = hcd_to_xhci(hcd);
-diff --git a/drivers/usb/host/xhci-mvebu.h b/drivers/usb/host/xhci-mvebu.h
-index 01bf3fcb3eca5..3be021793cc8b 100644
---- a/drivers/usb/host/xhci-mvebu.h
-+++ b/drivers/usb/host/xhci-mvebu.h
-@@ -12,7 +12,6 @@ struct usb_hcd;
-
- #if IS_ENABLED(CONFIG_USB_XHCI_MVEBU)
- int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd);
--int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd);
- int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd);
- #else
- static inline int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
-@@ -20,11 +19,6 @@ static inline int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
- return 0;
- }
-
--static inline int xhci_mvebu_a3700_plat_setup(struct usb_hcd *hcd)
--{
-- return 0;
--}
--
- static inline int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
- {
- return 0;
-diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
-index 83c7dffa945c3..ae67985178b02 100644
---- a/drivers/usb/host/xhci-plat.c
-+++ b/drivers/usb/host/xhci-plat.c
-@@ -44,16 +44,6 @@ static void xhci_priv_plat_start(struct usb_hcd *hcd)
- priv->plat_start(hcd);
- }
-
--static int xhci_priv_plat_setup(struct usb_hcd *hcd)
--{
-- struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
--
-- if (!priv->plat_setup)
-- return 0;
--
-- return priv->plat_setup(hcd);
--}
--
- static int xhci_priv_init_quirk(struct usb_hcd *hcd)
- {
- struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
-@@ -121,7 +111,6 @@ static const struct xhci_plat_priv xhci_plat_marvell_armada = {
- };
-
- static const struct xhci_plat_priv xhci_plat_marvell_armada3700 = {
-- .plat_setup = xhci_mvebu_a3700_plat_setup,
- .init_quirk = xhci_mvebu_a3700_init_quirk,
- };
-
-@@ -344,14 +333,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
-
- hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node);
- xhci->shared_hcd->tpl_support = hcd->tpl_support;
--
-- if (priv) {
-- ret = xhci_priv_plat_setup(hcd);
-- if (ret)
-- goto disable_usb_phy;
-- }
--
-- if ((xhci->quirks & XHCI_SKIP_PHY_INIT) || (priv && (priv->quirks & XHCI_SKIP_PHY_INIT)))
-+ if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT))
- hcd->skip_phy_initialization = 1;
-
- if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK))
-diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
-index 29f15298e315f..f3abce238207e 100644
---- a/drivers/usb/host/xhci-plat.h
-+++ b/drivers/usb/host/xhci-plat.h
-@@ -15,7 +15,6 @@ struct usb_hcd;
- struct xhci_plat_priv {
- const char *firmware_name;
- unsigned long long quirks;
-- int (*plat_setup)(struct usb_hcd *);
- void (*plat_start)(struct usb_hcd *);
- int (*init_quirk)(struct usb_hcd *);
- int (*suspend_quirk)(struct usb_hcd *);
---
-2.39.5
-
pwm-mediatek-ensure-to-disable-clocks-in-error-path.patch
netlink-fix-rmem-check-in-netlink_broadcast_deliver.patch
netlink-make-sure-we-allow-at-least-one-dump-skb.patch
-bluetooth-hci-set-extended-advertising-data-synchron.patch
-btrfs-fix-inode-lookup-error-handling-during-log-rep.patch
-xhci-allow-rpm-on-the-usb-controller-1022-43f7-by-de.patch
-usb-xhci-init-root-hub-ssp-rate.patch
-xhci-add-bus-number-to-some-debug-messages.patch
-revert-usb-host-xhci-mvebu-make-usb-3.0-phy-optional.patch
-xhci-factor-out-parts-of-xhci_gen_setup.patch
-xhci-prepare-for-operation-w-o-shared-hcd.patch
-usb-host-xhci-plat-create-shared-hcd-after-having-ad.patch
-usb-host-xhci-plat-prepare-operation-w-o-shared-hcd.patch
-xhci-disable-stream-for-xhc-controller-with-xhci_bro.patch
input-xpad-add-support-for-amazon-game-controller.patch
input-xpad-add-vid-for-turtle-beach-controllers.patch
input-xpad-support-acer-ngr-200-controller.patch
-usb-dwc3-clean-up-probe-declarations.patch
-usb-xhci-move-extcaps-related-macros-to-respective-h.patch
-usb-dwc3-abort-suspend-on-soft-disconnect-failure.patch
-smb-client-fix-readdir-returning-wrong-type-with-pos.patch
dma-buf-fix-timeout-handling-in-dma_resv_wait_timeou.patch
-usb-xhci-quirk-for-data-loss-in-isoc-transfers.patch
wifi-zd1211rw-fix-potential-null-pointer-dereference.patch
md-raid1-fix-stack-memory-use-after-return-in-raid1_.patch
net-appletalk-fix-device-refcount-leak-in-atrtr_crea.patch
+++ /dev/null
-From 31fa9af762eed42996a29d41a1927a98bd6fb5df Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 29 Jun 2025 19:05:05 +0200
-Subject: smb: client: fix readdir returning wrong type with POSIX extensions
-
-From: Philipp Kerling <pkerling@casix.org>
-
-[ Upstream commit b8f89cb723b9e66f5dbd7199e4036fee34fb0de0 ]
-
-When SMB 3.1.1 POSIX Extensions are negotiated, userspace applications
-using readdir() or getdents() calls without stat() on each individual file
-(such as a simple "ls" or "find") would misidentify file types and exhibit
-strange behavior such as not descending into directories. The reason for
-this behavior is an oversight in the cifs_posix_to_fattr conversion
-function. Instead of extracting the entry type for cf_dtype from the
-properly converted cf_mode field, it tries to extract the type from the
-PDU. While the wire representation of the entry mode is similar in
-structure to POSIX stat(), the assignments of the entry types are
-different. Applying the S_DT macro to cf_mode instead yields the correct
-result. This is also what the equivalent function
-smb311_posix_info_to_fattr in inode.c already does for stat() etc.; which
-is why "ls -l" would give the correct file type but "ls" would not (as
-identified by the colors).
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Philipp Kerling <pkerling@casix.org>
-Signed-off-by: Steve French <stfrench@microsoft.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/cifs/readdir.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
-index 9e62d75f24651..2691785cee700 100644
---- a/fs/cifs/readdir.c
-+++ b/fs/cifs/readdir.c
-@@ -276,7 +276,6 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info,
-
- if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
- fattr->cf_mode |= S_IFDIR;
-- fattr->cf_dtype = DT_DIR;
- } else {
- /*
- * mark anything that is not a dir as regular
-@@ -284,8 +283,9 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info,
- * attribute and will be marked as needing revaluation
- */
- fattr->cf_mode |= S_IFREG;
-- fattr->cf_dtype = DT_REG;
- }
-+ /* Use S_DT to extract file type from cf_mode for cf_dtype */
-+ fattr->cf_dtype = S_DT(fattr->cf_mode);
-
- if (reparse_file_needs_reval(fattr))
- fattr->cf_flags |= CIFS_FATTR_NEED_REVAL;
---
-2.39.5
-
+++ /dev/null
-From 28907062b07677367be1e4229fe70a0990bedef9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 12 Jul 2025 04:38:08 -0400
-Subject: usb: dwc3: Abort suspend on soft disconnect failure
-
-From: Kuen-Han Tsai <khtsai@google.com>
-
-[ Upstream commit 630a1dec3b0eba2a695b9063f1c205d585cbfec9 ]
-
-When dwc3_gadget_soft_disconnect() fails, dwc3_suspend_common() keeps
-going with the suspend, resulting in a period where the power domain is
-off, but the gadget driver remains connected. Within this time frame,
-invoking vbus_event_work() will cause an error as it attempts to access
-DWC3 registers for endpoint disabling after the power domain has been
-completely shut down.
-
-Abort the suspend sequence when dwc3_gadget_suspend() cannot halt the
-controller and proceeds with a soft connect.
-
-Fixes: 9f8a67b65a49 ("usb: dwc3: gadget: fix gadget suspend/resume")
-Cc: stable <stable@kernel.org>
-Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
-Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
-Link: https://lore.kernel.org/r/20250528100315.2162699-1-khtsai@google.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/dwc3/core.c | 34 +++++++++++++++++++++++++++-------
- drivers/usb/dwc3/core.h | 2 ++
- drivers/usb/dwc3/gadget.c | 25 ++++++++++++++++++++++---
- 3 files changed, 51 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
-index 3537afd17a26e..102ad4d2d4ebc 100644
---- a/drivers/usb/dwc3/core.c
-+++ b/drivers/usb/dwc3/core.c
-@@ -1733,16 +1733,29 @@ static int dwc3_core_init_for_resume(struct dwc3 *dwc)
-
- static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
- {
-- unsigned long flags;
- u32 reg;
-+ int ret;
-+
-+ if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) {
-+ dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) &
-+ DWC3_GUSB2PHYCFG_SUSPHY) ||
-+ (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) &
-+ DWC3_GUSB3PIPECTL_SUSPHY);
-+ /*
-+ * TI AM62 platform requires SUSPHY to be
-+ * enabled for system suspend to work.
-+ */
-+ if (!dwc->susphy_state)
-+ dwc3_enable_susphy(dwc, true);
-+ }
-
- switch (dwc->current_dr_role) {
- case DWC3_GCTL_PRTCAP_DEVICE:
- if (pm_runtime_suspended(dwc->dev))
- break;
-- spin_lock_irqsave(&dwc->lock, flags);
-- dwc3_gadget_suspend(dwc);
-- spin_unlock_irqrestore(&dwc->lock, flags);
-+ ret = dwc3_gadget_suspend(dwc);
-+ if (ret)
-+ return ret;
- synchronize_irq(dwc->irq_gadget);
- dwc3_core_exit(dwc);
- break;
-@@ -1773,9 +1786,9 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
- break;
-
- if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) {
-- spin_lock_irqsave(&dwc->lock, flags);
-- dwc3_gadget_suspend(dwc);
-- spin_unlock_irqrestore(&dwc->lock, flags);
-+ ret = dwc3_gadget_suspend(dwc);
-+ if (ret)
-+ return ret;
- synchronize_irq(dwc->irq_gadget);
- }
-
-@@ -1986,6 +1999,13 @@ static void dwc3_complete(struct device *dev)
- reg |= DWC3_GUCTL3_SPLITDISABLE;
- dwc3_writel(dwc->regs, DWC3_GUCTL3, reg);
- }
-+
-+ /*
-+ * Restore SUSPHY state to the original setting
-+ * if it was cleared during suspend
-+ */
-+ if (!dwc->susphy_state)
-+ dwc3_enable_susphy(dwc, false);
- }
- #else
- #define dwc3_complete NULL
-diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
-index 4ccbd2dc1bf81..97d361ab3e86f 100644
---- a/drivers/usb/dwc3/core.h
-+++ b/drivers/usb/dwc3/core.h
-@@ -1269,6 +1269,8 @@ struct dwc3 {
- unsigned dis_split_quirk:1;
-
- u16 imod_interval;
-+
-+ unsigned susphy_state:1;
- };
-
- #define INCRX_BURST_MODE 0
-diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
-index f3103baa74590..422efb4e61434 100644
---- a/drivers/usb/dwc3/gadget.c
-+++ b/drivers/usb/dwc3/gadget.c
-@@ -4106,12 +4106,31 @@ void dwc3_gadget_exit(struct dwc3 *dwc)
-
- int dwc3_gadget_suspend(struct dwc3 *dwc)
- {
-+ unsigned long flags;
-+ int ret;
-+
- if (!dwc->gadget_driver)
- return 0;
-
-- dwc3_gadget_run_stop(dwc, false, false);
-- dwc3_disconnect_gadget(dwc);
-- __dwc3_gadget_stop(dwc);
-+ ret = dwc3_gadget_soft_disconnect(dwc);
-+ /*
-+ * Attempt to reset the controller's state. Likely no
-+ * communication can be established until the host
-+ * performs a port reset.
-+ */
-+ if (ret && dwc->softconnect) {
-+ /* Soft connect logic - similar to pullup when is_on is true */
-+ dwc3_core_soft_reset(dwc);
-+ dwc3_event_buffers_setup(dwc);
-+ __dwc3_gadget_start(dwc);
-+ dwc3_gadget_run_stop(dwc, true, false);
-+ return -EAGAIN;
-+ }
-+
-+ spin_lock_irqsave(&dwc->lock, flags);
-+ if (dwc->gadget_driver)
-+ dwc3_disconnect_gadget(dwc);
-+ spin_unlock_irqrestore(&dwc->lock, flags);
-
- return 0;
- }
---
-2.39.5
-
+++ /dev/null
-From 2aa5523414e8be871a769f12dd0570ae2e0017bb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 4 Apr 2023 09:25:24 +0200
-Subject: USB: dwc3: clean up probe declarations
-
-From: Johan Hovold <johan+linaro@kernel.org>
-
-[ Upstream commit 9a4d7dd1990383df8ffa09d6879cecb0534405e1 ]
-
-Clean up the probe variable declarations by removing the stray newlines.
-
-Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
-Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
-Link: https://lore.kernel.org/r/20230404072524.19014-12-johan+linaro@kernel.org
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: 630a1dec3b0e ("usb: dwc3: Abort suspend on soft disconnect failure")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/dwc3/core.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
-index 1264683d45f20..3537afd17a26e 100644
---- a/drivers/usb/dwc3/core.c
-+++ b/drivers/usb/dwc3/core.c
-@@ -1526,12 +1526,10 @@ static int dwc3_probe(struct platform_device *pdev)
- {
- struct device *dev = &pdev->dev;
- struct resource *res, dwc_res;
-+ void __iomem *regs;
- struct dwc3 *dwc;
--
- int ret;
-
-- void __iomem *regs;
--
- dwc = devm_kzalloc(dev, sizeof(*dwc), GFP_KERNEL);
- if (!dwc)
- return -ENOMEM;
---
-2.39.5
-
+++ /dev/null
-From d77936304f8496621ce7b5796f3cf35a88e667ba Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 12 May 2022 01:04:44 +0300
-Subject: usb: host: xhci-plat: create shared hcd after having added main hcd
-
-From: Heiner Kallweit <hkallweit1@gmail.com>
-
-[ Upstream commit 0cf1ea040a7e2cae4776216d16d33d3898ea58de ]
-
-This patch is in preparation of an extension where in case of a
-root hub with no ports no shared hcd will be created.
-Whether one of the root hubs has no ports we figure our in
-usb_add_hcd() for the primary hcd. Therefore create the shared hcd
-only after this call.
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20220511220450.85367-4-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-plat.c | 29 ++++++++++++++++-------------
- 1 file changed, 16 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
-index ae67985178b02..b363063edab91 100644
---- a/drivers/usb/host/xhci-plat.c
-+++ b/drivers/usb/host/xhci-plat.c
-@@ -290,12 +290,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
- device_set_wakeup_capable(&pdev->dev, true);
-
- xhci->main_hcd = hcd;
-- xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
-- dev_name(&pdev->dev), hcd);
-- if (!xhci->shared_hcd) {
-- ret = -ENOMEM;
-- goto disable_clk;
-- }
-
- /* imod_interval is the interrupt moderation value in nanoseconds. */
- xhci->imod_interval = 40000;
-@@ -323,16 +317,16 @@ static int xhci_plat_probe(struct platform_device *pdev)
- if (IS_ERR(hcd->usb_phy)) {
- ret = PTR_ERR(hcd->usb_phy);
- if (ret == -EPROBE_DEFER)
-- goto put_usb3_hcd;
-+ goto disable_clk;
- hcd->usb_phy = NULL;
- } else {
- ret = usb_phy_init(hcd->usb_phy);
- if (ret)
-- goto put_usb3_hcd;
-+ goto disable_clk;
- }
-
- hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node);
-- xhci->shared_hcd->tpl_support = hcd->tpl_support;
-+
- if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT))
- hcd->skip_phy_initialization = 1;
-
-@@ -343,12 +337,21 @@ static int xhci_plat_probe(struct platform_device *pdev)
- if (ret)
- goto disable_usb_phy;
-
-+ xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
-+ dev_name(&pdev->dev), hcd);
-+ if (!xhci->shared_hcd) {
-+ ret = -ENOMEM;
-+ goto dealloc_usb2_hcd;
-+ }
-+
-+ xhci->shared_hcd->tpl_support = hcd->tpl_support;
-+
- if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
- xhci->shared_hcd->can_do_streams = 1;
-
- ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
- if (ret)
-- goto dealloc_usb2_hcd;
-+ goto put_usb3_hcd;
-
- device_enable_async_suspend(&pdev->dev);
- pm_runtime_put_noidle(&pdev->dev);
-@@ -362,15 +365,15 @@ static int xhci_plat_probe(struct platform_device *pdev)
- return 0;
-
-
-+put_usb3_hcd:
-+ usb_put_hcd(xhci->shared_hcd);
-+
- dealloc_usb2_hcd:
- usb_remove_hcd(hcd);
-
- disable_usb_phy:
- usb_phy_shutdown(hcd->usb_phy);
-
--put_usb3_hcd:
-- usb_put_hcd(xhci->shared_hcd);
--
- disable_clk:
- clk_disable_unprepare(xhci->clk);
-
---
-2.39.5
-
+++ /dev/null
-From ccc922bf9c9e3149575629e8328d7cf3612aaef1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 12 May 2022 01:04:45 +0300
-Subject: usb: host: xhci-plat: prepare operation w/o shared hcd
-
-From: Heiner Kallweit <hkallweit1@gmail.com>
-
-[ Upstream commit e0fe986972f5b6b12086c73569206dd29c520be9 ]
-
-This patch prepares xhci-plat for the following scenario
-- If either of the root hubs has no ports, then omit shared hcd
-- Main hcd can be USB3 if there are no USB2 ports
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20220511220450.85367-5-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-plat.c | 31 ++++++++++++++++++-------------
- 1 file changed, 18 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
-index b363063edab91..c7fe96c9ba6a4 100644
---- a/drivers/usb/host/xhci-plat.c
-+++ b/drivers/usb/host/xhci-plat.c
-@@ -180,7 +180,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
- struct device *sysdev, *tmpdev;
- struct xhci_hcd *xhci;
- struct resource *res;
-- struct usb_hcd *hcd;
-+ struct usb_hcd *hcd, *usb3_hcd;
- int ret;
- int irq;
- struct xhci_plat_priv *priv = NULL;
-@@ -337,21 +337,26 @@ static int xhci_plat_probe(struct platform_device *pdev)
- if (ret)
- goto disable_usb_phy;
-
-- xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
-- dev_name(&pdev->dev), hcd);
-- if (!xhci->shared_hcd) {
-- ret = -ENOMEM;
-- goto dealloc_usb2_hcd;
-- }
-+ if (!xhci_has_one_roothub(xhci)) {
-+ xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
-+ dev_name(&pdev->dev), hcd);
-+ if (!xhci->shared_hcd) {
-+ ret = -ENOMEM;
-+ goto dealloc_usb2_hcd;
-+ }
-
-- xhci->shared_hcd->tpl_support = hcd->tpl_support;
-+ xhci->shared_hcd->tpl_support = hcd->tpl_support;
-+ }
-
-- if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
-- xhci->shared_hcd->can_do_streams = 1;
-+ usb3_hcd = xhci_get_usb3_hcd(xhci);
-+ if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4)
-+ usb3_hcd->can_do_streams = 1;
-
-- ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
-- if (ret)
-- goto put_usb3_hcd;
-+ if (xhci->shared_hcd) {
-+ ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
-+ if (ret)
-+ goto put_usb3_hcd;
-+ }
-
- device_enable_async_suspend(&pdev->dev);
- pm_runtime_put_noidle(&pdev->dev);
---
-2.39.5
-
+++ /dev/null
-From fab985a4bbc03ee869aff52710282024fc1c2a6b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 10 Mar 2021 19:43:15 -0800
-Subject: usb: xhci: Init root hub SSP rate
-
-From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
-
-[ Upstream commit cd8d66cfae4989ed4b99c98b0c24d0eecba7005f ]
-
-Initialize USB 3.x root hub SuperSpeed Plus rate.
-
-Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
-Link: https://lore.kernel.org/r/f1698a96d5f9dfaefb857b95e5db6135ae0c9e93.1615432770.git.Thinh.Nguyen@synopsys.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
-index 908445cff24f8..e45353286e1b9 100644
---- a/drivers/usb/host/xhci.c
-+++ b/drivers/usb/host/xhci.c
-@@ -5272,10 +5272,12 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
- hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
- hcd->self.root_hub->rx_lanes = 2;
- hcd->self.root_hub->tx_lanes = 2;
-+ hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x2;
- break;
- case 1:
- hcd->speed = HCD_USB31;
- hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-+ hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x1;
- break;
- }
- xhci_info(xhci, "Host supports USB 3.%x %sSuperSpeed\n",
---
-2.39.5
-
+++ /dev/null
-From 404887679202c521a4a732b5ae58a85c0933e981 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 28 Aug 2023 19:00:23 +0530
-Subject: usb: xhci: Move extcaps related macros to respective header file
-
-From: Krishna Kurapati <quic_kriskura@quicinc.com>
-
-[ Upstream commit 60958b3abacc4eeea21236aa61bfacd1c3520168 ]
-
-DWC3 driver needs access to XHCI Extended Capabilities registers to
-read number of usb2 ports and usb3 ports present on multiport controller.
-Since the extcaps header is sufficient to parse this info, move port_count
-related macros and structure from xhci.h to xhci-ext-caps.h.
-
-Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
-Link: https://lore.kernel.org/r/20230828133033.11988-4-quic_kriskura@quicinc.com
-Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: 630a1dec3b0e ("usb: dwc3: Abort suspend on soft disconnect failure")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-ext-caps.h | 27 +++++++++++++++++++++++++++
- drivers/usb/host/xhci.h | 27 ---------------------------
- 2 files changed, 27 insertions(+), 27 deletions(-)
-
-diff --git a/drivers/usb/host/xhci-ext-caps.h b/drivers/usb/host/xhci-ext-caps.h
-index e8af0a125f84b..96eb36a587382 100644
---- a/drivers/usb/host/xhci-ext-caps.h
-+++ b/drivers/usb/host/xhci-ext-caps.h
-@@ -79,6 +79,33 @@
- /* true: Controller Not Ready to accept doorbell or op reg writes after reset */
- #define XHCI_STS_CNR (1 << 11)
-
-+/**
-+ * struct xhci_protocol_caps
-+ * @revision: major revision, minor revision, capability ID,
-+ * and next capability pointer.
-+ * @name_string: Four ASCII characters to say which spec this xHC
-+ * follows, typically "USB ".
-+ * @port_info: Port offset, count, and protocol-defined information.
-+ */
-+struct xhci_protocol_caps {
-+ u32 revision;
-+ u32 name_string;
-+ u32 port_info;
-+};
-+
-+#define XHCI_EXT_PORT_MAJOR(x) (((x) >> 24) & 0xff)
-+#define XHCI_EXT_PORT_MINOR(x) (((x) >> 16) & 0xff)
-+#define XHCI_EXT_PORT_PSIC(x) (((x) >> 28) & 0x0f)
-+#define XHCI_EXT_PORT_OFF(x) ((x) & 0xff)
-+#define XHCI_EXT_PORT_COUNT(x) (((x) >> 8) & 0xff)
-+
-+#define XHCI_EXT_PORT_PSIV(x) (((x) >> 0) & 0x0f)
-+#define XHCI_EXT_PORT_PSIE(x) (((x) >> 4) & 0x03)
-+#define XHCI_EXT_PORT_PLT(x) (((x) >> 6) & 0x03)
-+#define XHCI_EXT_PORT_PFD(x) (((x) >> 8) & 0x01)
-+#define XHCI_EXT_PORT_LP(x) (((x) >> 14) & 0x03)
-+#define XHCI_EXT_PORT_PSIM(x) (((x) >> 16) & 0xffff)
-+
- #include <linux/io.h>
-
- /**
-diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
-index 166978caa6db3..bf3798ce716f3 100644
---- a/drivers/usb/host/xhci.h
-+++ b/drivers/usb/host/xhci.h
-@@ -555,33 +555,6 @@ struct xhci_doorbell_array {
- #define DB_VALUE(ep, stream) ((((ep) + 1) & 0xff) | ((stream) << 16))
- #define DB_VALUE_HOST 0x00000000
-
--/**
-- * struct xhci_protocol_caps
-- * @revision: major revision, minor revision, capability ID,
-- * and next capability pointer.
-- * @name_string: Four ASCII characters to say which spec this xHC
-- * follows, typically "USB ".
-- * @port_info: Port offset, count, and protocol-defined information.
-- */
--struct xhci_protocol_caps {
-- u32 revision;
-- u32 name_string;
-- u32 port_info;
--};
--
--#define XHCI_EXT_PORT_MAJOR(x) (((x) >> 24) & 0xff)
--#define XHCI_EXT_PORT_MINOR(x) (((x) >> 16) & 0xff)
--#define XHCI_EXT_PORT_PSIC(x) (((x) >> 28) & 0x0f)
--#define XHCI_EXT_PORT_OFF(x) ((x) & 0xff)
--#define XHCI_EXT_PORT_COUNT(x) (((x) >> 8) & 0xff)
--
--#define XHCI_EXT_PORT_PSIV(x) (((x) >> 0) & 0x0f)
--#define XHCI_EXT_PORT_PSIE(x) (((x) >> 4) & 0x03)
--#define XHCI_EXT_PORT_PLT(x) (((x) >> 6) & 0x03)
--#define XHCI_EXT_PORT_PFD(x) (((x) >> 8) & 0x01)
--#define XHCI_EXT_PORT_LP(x) (((x) >> 14) & 0x03)
--#define XHCI_EXT_PORT_PSIM(x) (((x) >> 16) & 0xffff)
--
- #define PLT_MASK (0x03 << 6)
- #define PLT_SYM (0x00 << 6)
- #define PLT_ASYM_RX (0x02 << 6)
---
-2.39.5
-
+++ /dev/null
-From 7ddf51a70191e6b03869cd20216ed1fd91823335 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 27 Jun 2025 17:41:19 +0300
-Subject: usb: xhci: quirk for data loss in ISOC transfers
-
-From: Raju Rangoju <Raju.Rangoju@amd.com>
-
-[ Upstream commit cbc889ab0122366f6cdbe3c28d477c683ebcebc2 ]
-
-During the High-Speed Isochronous Audio transfers, xHCI
-controller on certain AMD platforms experiences momentary data
-loss. This results in Missed Service Errors (MSE) being
-generated by the xHCI.
-
-The root cause of the MSE is attributed to the ISOC OUT endpoint
-being omitted from scheduling. This can happen when an IN
-endpoint with a 64ms service interval either is pre-scheduled
-prior to the ISOC OUT endpoint or the interval of the ISOC OUT
-endpoint is shorter than that of the IN endpoint. Consequently,
-the OUT service is neglected when an IN endpoint with a service
-interval exceeding 32ms is scheduled concurrently (every 64ms in
-this scenario).
-
-This issue is particularly seen on certain older AMD platforms.
-To mitigate this problem, it is recommended to adjust the service
-interval of the IN endpoint to not exceed 32ms (interval 8). This
-adjustment ensures that the OUT endpoint will not be bypassed,
-even if a smaller interval value is utilized.
-
-Cc: stable <stable@kernel.org>
-Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20250627144127.3889714-2-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-mem.c | 4 ++++
- drivers/usb/host/xhci-pci.c | 26 ++++++++++++++++++++++++++
- drivers/usb/host/xhci.h | 1 +
- 3 files changed, 31 insertions(+)
-
-diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
-index 0891f0d21af16..5b1aa82f7701d 100644
---- a/drivers/usb/host/xhci-mem.c
-+++ b/drivers/usb/host/xhci-mem.c
-@@ -1480,6 +1480,10 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
- /* Periodic endpoint bInterval limit quirk */
- if (usb_endpoint_xfer_int(&ep->desc) ||
- usb_endpoint_xfer_isoc(&ep->desc)) {
-+ if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_9) &&
-+ interval >= 9) {
-+ interval = 8;
-+ }
- if ((xhci->quirks & XHCI_LIMIT_ENDPOINT_INTERVAL_7) &&
- udev->speed >= USB_SPEED_HIGH &&
- interval >= 7) {
-diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
-index 202c176eb894a..4153bed4062c9 100644
---- a/drivers/usb/host/xhci-pci.c
-+++ b/drivers/usb/host/xhci-pci.c
-@@ -64,11 +64,22 @@
- #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI 0x51ed
- #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_PCH_XHCI 0x54ed
-
-+#define PCI_DEVICE_ID_AMD_ARIEL_TYPEC_XHCI 0x13ed
-+#define PCI_DEVICE_ID_AMD_ARIEL_TYPEA_XHCI 0x13ee
-+#define PCI_DEVICE_ID_AMD_STARSHIP_XHCI 0x148c
-+#define PCI_DEVICE_ID_AMD_FIREFLIGHT_15D4_XHCI 0x15d4
-+#define PCI_DEVICE_ID_AMD_FIREFLIGHT_15D5_XHCI 0x15d5
-+#define PCI_DEVICE_ID_AMD_RAVEN_15E0_XHCI 0x15e0
-+#define PCI_DEVICE_ID_AMD_RAVEN_15E1_XHCI 0x15e1
-+#define PCI_DEVICE_ID_AMD_RAVEN2_XHCI 0x15e5
-+#define PCI_DEVICE_ID_AMD_RENOIR_XHCI 0x1639
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
- #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc
-
-+#define PCI_DEVICE_ID_ATI_NAVI10_7316_XHCI 0x7316
-+
- #define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042
- #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142
- #define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242
-@@ -163,6 +174,21 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
- if (pdev->vendor == PCI_VENDOR_ID_NEC)
- xhci->quirks |= XHCI_NEC_HOST;
-
-+ if (pdev->vendor == PCI_VENDOR_ID_AMD &&
-+ (pdev->device == PCI_DEVICE_ID_AMD_ARIEL_TYPEC_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_ARIEL_TYPEA_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_STARSHIP_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_FIREFLIGHT_15D4_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_FIREFLIGHT_15D5_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_RAVEN_15E0_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_RAVEN_15E1_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_AMD_RAVEN2_XHCI))
-+ xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_9;
-+
-+ if (pdev->vendor == PCI_VENDOR_ID_ATI &&
-+ pdev->device == PCI_DEVICE_ID_ATI_NAVI10_7316_XHCI)
-+ xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_9;
-+
- if (pdev->vendor == PCI_VENDOR_ID_AMD && xhci->hci_version == 0x96)
- xhci->quirks |= XHCI_AMD_0x96_HOST;
-
-diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
-index bf3798ce716f3..18b89c1576388 100644
---- a/drivers/usb/host/xhci.h
-+++ b/drivers/usb/host/xhci.h
-@@ -1877,6 +1877,7 @@ struct xhci_hcd {
- #define XHCI_RESET_TO_DEFAULT BIT_ULL(44)
- #define XHCI_TRB_OVERFETCH BIT_ULL(45)
- #define XHCI_ZHAOXIN_HOST BIT_ULL(46)
-+#define XHCI_LIMIT_ENDPOINT_INTERVAL_9 BIT_ULL(47)
-
- unsigned int num_active_eps;
- unsigned int limit_active_eps;
---
-2.39.5
-
+++ /dev/null
-From 18e1d600069cb425c0766c63485544ecc2554b6d Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 20 Aug 2021 15:35:03 +0300
-Subject: xhci: Add bus number to some debug messages
-
-From: Mathias Nyman <mathias.nyman@linux.intel.com>
-
-[ Upstream commit 669bc5a188b40a4edc9c2a42e5b32f19182767d9 ]
-
-As we register two usb buses for each xHC, and systems with several
-hosts are more and more common it is getting hard to follow the
-flow of debug messages without knowing which bus they belong to
-
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20210820123503.2605901-7-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-hub.c | 6 ++++--
- drivers/usb/host/xhci-ring.c | 3 ++-
- drivers/usb/host/xhci.c | 6 ++++--
- 3 files changed, 10 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
-index e92f920256b2e..ab28e0971e4a0 100644
---- a/drivers/usb/host/xhci-hub.c
-+++ b/drivers/usb/host/xhci-hub.c
-@@ -1597,7 +1597,8 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
- status = 1;
- }
- if (!status && !reset_change) {
-- xhci_dbg(xhci, "%s: stopping port polling.\n", __func__);
-+ xhci_dbg(xhci, "%s: stopping usb%d port polling\n",
-+ __func__, hcd->self.busnum);
- clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
- }
- spin_unlock_irqrestore(&xhci->lock, flags);
-@@ -1629,7 +1630,8 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
- if (bus_state->resuming_ports || /* USB2 */
- bus_state->port_remote_wakeup) { /* USB3 */
- spin_unlock_irqrestore(&xhci->lock, flags);
-- xhci_dbg(xhci, "suspend failed because a port is resuming\n");
-+ xhci_dbg(xhci, "usb%d bus suspend to fail because a port is resuming\n",
-+ hcd->self.busnum);
- return -EBUSY;
- }
- }
-diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
-index 954cd962e113c..6cf1688c39d4a 100644
---- a/drivers/usb/host/xhci-ring.c
-+++ b/drivers/usb/host/xhci-ring.c
-@@ -1929,7 +1929,8 @@ static void handle_port_status(struct xhci_hcd *xhci,
- * bits are still set. When an event occurs, switch over to
- * polling to avoid losing status changes.
- */
-- xhci_dbg(xhci, "%s: starting port polling.\n", __func__);
-+ xhci_dbg(xhci, "%s: starting usb%d port polling.\n",
-+ __func__, hcd->self.busnum);
- set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
- spin_unlock(&xhci->lock);
- /* Pass this up to the core */
-diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
-index e45353286e1b9..26ee29e684c5d 100644
---- a/drivers/usb/host/xhci.c
-+++ b/drivers/usb/host/xhci.c
-@@ -1017,7 +1017,8 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup)
- xhci_dbc_suspend(xhci);
-
- /* Don't poll the roothubs on bus suspend. */
-- xhci_dbg(xhci, "%s: stopping port polling.\n", __func__);
-+ xhci_dbg(xhci, "%s: stopping usb%d port polling.\n",
-+ __func__, hcd->self.busnum);
- clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
- del_timer_sync(&hcd->rh_timer);
- clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
-@@ -1289,7 +1290,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
- usb_asmedia_modifyflowcontrol(to_pci_dev(hcd->self.controller));
-
- /* Re-enable port polling. */
-- xhci_dbg(xhci, "%s: starting port polling.\n", __func__);
-+ xhci_dbg(xhci, "%s: starting usb%d port polling.\n",
-+ __func__, hcd->self.busnum);
- set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
- usb_hcd_poll_rh_status(xhci->shared_hcd);
- set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
---
-2.39.5
-
+++ /dev/null
-From 147b99ebb9b28be96ae25773e60c53ab43d898aa Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 4 Mar 2024 11:13:27 +0530
-Subject: xhci: Allow RPM on the USB controller (1022:43f7) by default
-
-From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
-
-[ Upstream commit 28cbed496059fe1868203b76e9e0ef285733524d ]
-
-Enable runtime PM by default for older AMD 1022:43f7 xHCI 1.1 host as it
-is proven to work.
-Driver enables runtime PM by default for newer xHCI 1.2 host.
-
-Link: https://lore.kernel.org/all/12335218.O9o76ZdvQC@natalenko.name/
-Cc: Mario Limonciello <mario.limonciello@amd.com>
-Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
-Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
-Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20240304054327.2564500-1-Basavaraj.Natikar@amd.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cbc889ab0122 ("usb: xhci: quirk for data loss in ISOC transfers")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-pci.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
-index 2be84d5e9261d..202c176eb894a 100644
---- a/drivers/usb/host/xhci-pci.c
-+++ b/drivers/usb/host/xhci-pci.c
-@@ -186,8 +186,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
- xhci->quirks |= XHCI_RESET_ON_RESUME;
- }
-
-- if (pdev->vendor == PCI_VENDOR_ID_AMD)
-+ if (pdev->vendor == PCI_VENDOR_ID_AMD) {
- xhci->quirks |= XHCI_TRUST_TX_LENGTH;
-+ if (pdev->device == 0x43f7)
-+ xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
-+ }
-
- if ((pdev->vendor == PCI_VENDOR_ID_AMD) &&
- ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) ||
---
-2.39.5
-
+++ /dev/null
-From 12b3dffca6f9d80893e84ecfef4bb5fd9b77f853 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 27 Jun 2025 17:41:20 +0300
-Subject: xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS
-
-From: Hongyu Xie <xiehongyu1@kylinos.cn>
-
-[ Upstream commit cd65ee81240e8bc3c3119b46db7f60c80864b90b ]
-
-Disable stream for platform xHC controller with broken stream.
-
-Fixes: 14aec589327a6 ("storage: accept some UAS devices if streams are unavailable")
-Cc: stable <stable@kernel.org>
-Signed-off-by: Hongyu Xie <xiehongyu1@kylinos.cn>
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20250627144127.3889714-3-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-plat.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
-index c7fe96c9ba6a4..06c303c1e353a 100644
---- a/drivers/usb/host/xhci-plat.c
-+++ b/drivers/usb/host/xhci-plat.c
-@@ -349,7 +349,8 @@ static int xhci_plat_probe(struct platform_device *pdev)
- }
-
- usb3_hcd = xhci_get_usb3_hcd(xhci);
-- if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4)
-+ if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4 &&
-+ !(xhci->quirks & XHCI_BROKEN_STREAMS))
- usb3_hcd->can_do_streams = 1;
-
- if (xhci->shared_hcd) {
---
-2.39.5
-
+++ /dev/null
-From 85016548b24f809655c16c15da229c898e2721b0 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 12 May 2022 01:04:42 +0300
-Subject: xhci: factor out parts of xhci_gen_setup()
-
-From: Heiner Kallweit <hkallweit1@gmail.com>
-
-[ Upstream commit 57f23cd0bf2f56d339f810a913a9c0c5abfcfc7e ]
-
-Factoring out parts of xhci_gen_setup() has two motivations:
-- When adding functionaliy to omit shared hcd if not needed in a
- subsequent patch, we'll have to call xhci_hcd_init_usb3_data()
- from two places.
-- It reduces size of xhci_gen_setup() and makes it better readable.
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20220511220450.85367-2-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci.c | 104 +++++++++++++++++++++-------------------
- 1 file changed, 54 insertions(+), 50 deletions(-)
-
-diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
-index 26ee29e684c5d..f2e868089ec1e 100644
---- a/drivers/usb/host/xhci.c
-+++ b/drivers/usb/host/xhci.c
-@@ -5217,6 +5217,57 @@ static int xhci_get_frame(struct usb_hcd *hcd)
- return readl(&xhci->run_regs->microframe_index) >> 3;
- }
-
-+static void xhci_hcd_init_usb2_data(struct xhci_hcd *xhci, struct usb_hcd *hcd)
-+{
-+ xhci->usb2_rhub.hcd = hcd;
-+ hcd->speed = HCD_USB2;
-+ hcd->self.root_hub->speed = USB_SPEED_HIGH;
-+ /*
-+ * USB 2.0 roothub under xHCI has an integrated TT,
-+ * (rate matching hub) as opposed to having an OHCI/UHCI
-+ * companion controller.
-+ */
-+ hcd->has_tt = 1;
-+}
-+
-+static void xhci_hcd_init_usb3_data(struct xhci_hcd *xhci, struct usb_hcd *hcd)
-+{
-+ unsigned int minor_rev;
-+
-+ /*
-+ * Early xHCI 1.1 spec did not mention USB 3.1 capable hosts
-+ * should return 0x31 for sbrn, or that the minor revision
-+ * is a two digit BCD containig minor and sub-minor numbers.
-+ * This was later clarified in xHCI 1.2.
-+ *
-+ * Some USB 3.1 capable hosts therefore have sbrn 0x30, and
-+ * minor revision set to 0x1 instead of 0x10.
-+ */
-+ if (xhci->usb3_rhub.min_rev == 0x1)
-+ minor_rev = 1;
-+ else
-+ minor_rev = xhci->usb3_rhub.min_rev / 0x10;
-+
-+ switch (minor_rev) {
-+ case 2:
-+ hcd->speed = HCD_USB32;
-+ hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-+ hcd->self.root_hub->rx_lanes = 2;
-+ hcd->self.root_hub->tx_lanes = 2;
-+ hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x2;
-+ break;
-+ case 1:
-+ hcd->speed = HCD_USB31;
-+ hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-+ hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x1;
-+ break;
-+ }
-+ xhci_info(xhci, "Host supports USB 3.%x %sSuperSpeed\n",
-+ minor_rev, minor_rev ? "Enhanced " : "");
-+
-+ xhci->usb3_rhub.hcd = hcd;
-+}
-+
- int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
- {
- struct xhci_hcd *xhci;
-@@ -5225,7 +5276,6 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
- * quirks
- */
- struct device *dev = hcd->self.sysdev;
-- unsigned int minor_rev;
- int retval;
-
- /* Accept arbitrarily long scatter-gather lists */
-@@ -5240,60 +5290,14 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
- xhci = hcd_to_xhci(hcd);
-
- if (usb_hcd_is_primary_hcd(hcd)) {
-- xhci->main_hcd = hcd;
-- xhci->usb2_rhub.hcd = hcd;
-- /* Mark the first roothub as being USB 2.0.
-- * The xHCI driver will register the USB 3.0 roothub.
-- */
-- hcd->speed = HCD_USB2;
-- hcd->self.root_hub->speed = USB_SPEED_HIGH;
-- /*
-- * USB 2.0 roothub under xHCI has an integrated TT,
-- * (rate matching hub) as opposed to having an OHCI/UHCI
-- * companion controller.
-- */
-- hcd->has_tt = 1;
-+ xhci_hcd_init_usb2_data(xhci, hcd);
- } else {
-- /*
-- * Early xHCI 1.1 spec did not mention USB 3.1 capable hosts
-- * should return 0x31 for sbrn, or that the minor revision
-- * is a two digit BCD containig minor and sub-minor numbers.
-- * This was later clarified in xHCI 1.2.
-- *
-- * Some USB 3.1 capable hosts therefore have sbrn 0x30, and
-- * minor revision set to 0x1 instead of 0x10.
-- */
-- if (xhci->usb3_rhub.min_rev == 0x1)
-- minor_rev = 1;
-- else
-- minor_rev = xhci->usb3_rhub.min_rev / 0x10;
--
-- switch (minor_rev) {
-- case 2:
-- hcd->speed = HCD_USB32;
-- hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-- hcd->self.root_hub->rx_lanes = 2;
-- hcd->self.root_hub->tx_lanes = 2;
-- hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x2;
-- break;
-- case 1:
-- hcd->speed = HCD_USB31;
-- hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
-- hcd->self.root_hub->ssp_rate = USB_SSP_GEN_2x1;
-- break;
-- }
-- xhci_info(xhci, "Host supports USB 3.%x %sSuperSpeed\n",
-- minor_rev,
-- minor_rev ? "Enhanced " : "");
--
-- xhci->usb3_rhub.hcd = hcd;
-- /* xHCI private pointer was set in xhci_pci_probe for the second
-- * registered roothub.
-- */
-+ xhci_hcd_init_usb3_data(xhci, hcd);
- return 0;
- }
-
- mutex_init(&xhci->mutex);
-+ xhci->main_hcd = hcd;
- xhci->cap_regs = hcd->regs;
- xhci->op_regs = hcd->regs +
- HC_LENGTH(readl(&xhci->cap_regs->hc_capbase));
---
-2.39.5
-
+++ /dev/null
-From 047d50cb07e81cd5241655702b2da260b1a42ae9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 12 May 2022 01:04:43 +0300
-Subject: xhci: prepare for operation w/o shared hcd
-
-From: Heiner Kallweit <hkallweit1@gmail.com>
-
-[ Upstream commit 873f323618c202cd0675324a1027dcecc7745d0b ]
-
-This patch prepares xhci for the following scenario:
-- If either of the root hubs has no ports, then omit shared hcd
-- Main hcd can be USB3 if there are no USB2 ports
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
-Link: https://lore.kernel.org/r/20220511220450.85367-3-mathias.nyman@linux.intel.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Stable-dep-of: cd65ee81240e ("xhci: Disable stream for xHC controller with XHCI_BROKEN_STREAMS")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/usb/host/xhci-hub.c | 3 ++-
- drivers/usb/host/xhci-mem.c | 11 ++++----
- drivers/usb/host/xhci.c | 53 ++++++++++++++++++++++++-------------
- drivers/usb/host/xhci.h | 26 ++++++++++++++++++
- 4 files changed, 68 insertions(+), 25 deletions(-)
-
-diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
-index ab28e0971e4a0..3e165d4050873 100644
---- a/drivers/usb/host/xhci-hub.c
-+++ b/drivers/usb/host/xhci-hub.c
-@@ -621,6 +621,7 @@ static int xhci_enter_test_mode(struct xhci_hcd *xhci,
- u16 test_mode, u16 wIndex, unsigned long *flags)
- __must_hold(&xhci->lock)
- {
-+ struct usb_hcd *usb3_hcd = xhci_get_usb3_hcd(xhci);
- int i, retval;
-
- /* Disable all Device Slots */
-@@ -641,7 +642,7 @@ static int xhci_enter_test_mode(struct xhci_hcd *xhci,
- xhci_dbg(xhci, "Disable all port (PP = 0)\n");
- /* Power off USB3 ports*/
- for (i = 0; i < xhci->usb3_rhub.num_ports; i++)
-- xhci_set_port_power(xhci, xhci->shared_hcd, i, false, flags);
-+ xhci_set_port_power(xhci, usb3_hcd, i, false, flags);
- /* Power off USB2 ports*/
- for (i = 0; i < xhci->usb2_rhub.num_ports; i++)
- xhci_set_port_power(xhci, xhci->main_hcd, i, false, flags);
-diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
-index 5b0e009783229..0891f0d21af16 100644
---- a/drivers/usb/host/xhci-mem.c
-+++ b/drivers/usb/host/xhci-mem.c
-@@ -1099,7 +1099,7 @@ static u32 xhci_find_real_port_number(struct xhci_hcd *xhci,
- struct usb_hcd *hcd;
-
- if (udev->speed >= USB_SPEED_SUPER)
-- hcd = xhci->shared_hcd;
-+ hcd = xhci_get_usb3_hcd(xhci);
- else
- hcd = xhci->main_hcd;
-
-@@ -2415,10 +2415,11 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
- xhci->usb2_rhub.num_ports = USB_MAXCHILDREN;
- }
-
-- /*
-- * Note we could have all USB 3.0 ports, or all USB 2.0 ports.
-- * Not sure how the USB core will handle a hub with no ports...
-- */
-+ if (!xhci->usb2_rhub.num_ports)
-+ xhci_info(xhci, "USB2 root hub has no ports\n");
-+
-+ if (!xhci->usb3_rhub.num_ports)
-+ xhci_info(xhci, "USB3 root hub has no ports\n");
-
- xhci_create_rhub_port_array(xhci, &xhci->usb2_rhub, flags);
- xhci_create_rhub_port_array(xhci, &xhci->usb3_rhub, flags);
-diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
-index f2e868089ec1e..9ba1825dcbcc3 100644
---- a/drivers/usb/host/xhci.c
-+++ b/drivers/usb/host/xhci.c
-@@ -490,6 +490,10 @@ static void compliance_mode_recovery(struct timer_list *t)
-
- xhci = from_timer(xhci, t, comp_mode_recovery_timer);
- rhub = &xhci->usb3_rhub;
-+ hcd = rhub->hcd;
-+
-+ if (!hcd)
-+ return;
-
- for (i = 0; i < rhub->num_ports; i++) {
- temp = readl(rhub->ports[i]->addr);
-@@ -503,7 +507,6 @@ static void compliance_mode_recovery(struct timer_list *t)
- i + 1);
- xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
- "Attempting compliance mode recovery");
-- hcd = xhci->shared_hcd;
-
- if (hcd->state == HC_STATE_SUSPENDED)
- usb_hcd_resume_root_hub(hcd);
-@@ -616,14 +619,11 @@ static int xhci_run_finished(struct xhci_hcd *xhci)
- xhci_halt(xhci);
- return -ENODEV;
- }
-- xhci->shared_hcd->state = HC_STATE_RUNNING;
- xhci->cmd_ring_state = CMD_RING_STATE_RUNNING;
-
- if (xhci->quirks & XHCI_NEC_HOST)
- xhci_ring_cmd_db(xhci);
-
-- xhci_dbg_trace(xhci, trace_xhci_dbg_init,
-- "Finished xhci_run for USB3 roothub");
- return 0;
- }
-
-@@ -698,7 +698,7 @@ int xhci_run(struct usb_hcd *hcd)
- xhci_free_command(xhci, command);
- }
- xhci_dbg_trace(xhci, trace_xhci_dbg_init,
-- "Finished xhci_run for USB2 roothub");
-+ "Finished %s for main hcd", __func__);
-
- set_bit(HCD_FLAG_DEFER_RH_REGISTER, &hcd->flags);
-
-@@ -706,6 +706,9 @@ int xhci_run(struct usb_hcd *hcd)
-
- xhci_debugfs_init(xhci);
-
-+ if (xhci_has_one_roothub(xhci))
-+ return xhci_run_finished(xhci);
-+
- return 0;
- }
- EXPORT_SYMBOL_GPL(xhci_run);
-@@ -1004,7 +1007,7 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup)
- return 0;
-
- if (hcd->state != HC_STATE_SUSPENDED ||
-- xhci->shared_hcd->state != HC_STATE_SUSPENDED)
-+ (xhci->shared_hcd && xhci->shared_hcd->state != HC_STATE_SUSPENDED))
- return -EINVAL;
-
- /* Clear root port wake on bits if wakeup not allowed. */
-@@ -1021,15 +1024,18 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup)
- __func__, hcd->self.busnum);
- clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
- del_timer_sync(&hcd->rh_timer);
-- clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
-- del_timer_sync(&xhci->shared_hcd->rh_timer);
-+ if (xhci->shared_hcd) {
-+ clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
-+ del_timer_sync(&xhci->shared_hcd->rh_timer);
-+ }
-
- if (xhci->quirks & XHCI_SUSPEND_DELAY)
- usleep_range(1000, 1500);
-
- spin_lock_irq(&xhci->lock);
- clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-- clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
-+ if (xhci->shared_hcd)
-+ clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
- /* step 1: stop endpoint */
- /* skipped assuming that port suspend has done */
-
-@@ -1129,7 +1135,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
- msleep(100);
-
- set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-- set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
-+ if (xhci->shared_hcd)
-+ set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
-
- spin_lock_irq(&xhci->lock);
-
-@@ -1190,7 +1197,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
-
- /* Let the USB core know _both_ roothubs lost power. */
- usb_root_hub_lost_power(xhci->main_hcd->self.root_hub);
-- usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub);
-+ if (xhci->shared_hcd)
-+ usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub);
-
- xhci_dbg(xhci, "Stop HCD\n");
- xhci_halt(xhci);
-@@ -1230,12 +1238,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
-
- xhci_dbg(xhci, "Start the primary HCD\n");
- retval = xhci_run(hcd->primary_hcd);
-- if (!retval) {
-+ if (!retval && secondary_hcd) {
- xhci_dbg(xhci, "Start the secondary HCD\n");
- retval = xhci_run(secondary_hcd);
- }
- hcd->state = HC_STATE_SUSPENDED;
-- xhci->shared_hcd->state = HC_STATE_SUSPENDED;
-+ if (xhci->shared_hcd)
-+ xhci->shared_hcd->state = HC_STATE_SUSPENDED;
- goto done;
- }
-
-@@ -1273,7 +1282,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
- }
-
- if (pending_portevent) {
-- usb_hcd_resume_root_hub(xhci->shared_hcd);
-+ if (xhci->shared_hcd)
-+ usb_hcd_resume_root_hub(xhci->shared_hcd);
- usb_hcd_resume_root_hub(hcd);
- }
- }
-@@ -1292,8 +1302,10 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
- /* Re-enable port polling. */
- xhci_dbg(xhci, "%s: starting usb%d port polling.\n",
- __func__, hcd->self.busnum);
-- set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
-- usb_hcd_poll_rh_status(xhci->shared_hcd);
-+ if (xhci->shared_hcd) {
-+ set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
-+ usb_hcd_poll_rh_status(xhci->shared_hcd);
-+ }
- set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
- usb_hcd_poll_rh_status(hcd);
-
-@@ -5289,9 +5301,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
-
- xhci = hcd_to_xhci(hcd);
-
-- if (usb_hcd_is_primary_hcd(hcd)) {
-- xhci_hcd_init_usb2_data(xhci, hcd);
-- } else {
-+ if (!usb_hcd_is_primary_hcd(hcd)) {
- xhci_hcd_init_usb3_data(xhci, hcd);
- return 0;
- }
-@@ -5373,6 +5383,11 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
- return retval;
- xhci_dbg(xhci, "Called HCD init\n");
-
-+ if (xhci_hcd_is_usb3(hcd))
-+ xhci_hcd_init_usb3_data(xhci, hcd);
-+ else
-+ xhci_hcd_init_usb2_data(xhci, hcd);
-+
- xhci_info(xhci, "hcc params 0x%08x hci version 0x%x quirks 0x%016llx\n",
- xhci->hcc_params, xhci->hci_version, xhci->quirks);
-
-diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
-index 2d2e9c59add62..166978caa6db3 100644
---- a/drivers/usb/host/xhci.h
-+++ b/drivers/usb/host/xhci.h
-@@ -1914,6 +1914,8 @@ struct xhci_hcd {
- unsigned hw_lpm_support:1;
- /* Broken Suspend flag for SNPS Suspend resume issue */
- unsigned broken_suspend:1;
-+ /* Indicates that omitting hcd is supported if root hub has no ports */
-+ unsigned allow_single_roothub:1;
- /* cached usb2 extened protocol capabilites */
- u32 *ext_caps;
- unsigned int num_ext_caps;
-@@ -1967,6 +1969,30 @@ static inline struct usb_hcd *xhci_to_hcd(struct xhci_hcd *xhci)
- return xhci->main_hcd;
- }
-
-+static inline struct usb_hcd *xhci_get_usb3_hcd(struct xhci_hcd *xhci)
-+{
-+ if (xhci->shared_hcd)
-+ return xhci->shared_hcd;
-+
-+ if (!xhci->usb2_rhub.num_ports)
-+ return xhci->main_hcd;
-+
-+ return NULL;
-+}
-+
-+static inline bool xhci_hcd_is_usb3(struct usb_hcd *hcd)
-+{
-+ struct xhci_hcd *xhci = hcd_to_xhci(hcd);
-+
-+ return hcd == xhci_get_usb3_hcd(xhci);
-+}
-+
-+static inline bool xhci_has_one_roothub(struct xhci_hcd *xhci)
-+{
-+ return xhci->allow_single_roothub &&
-+ (!xhci->usb2_rhub.num_ports || !xhci->usb3_rhub.num_ports);
-+}
-+
- #define xhci_dbg(xhci, fmt, args...) \
- dev_dbg(xhci_to_hcd(xhci)->self.controller , fmt , ## args)
- #define xhci_err(xhci, fmt, args...) \
---
-2.39.5
-
+++ /dev/null
-From 6adb7d09869b148ebee4563459ec4a0750bd11b8 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 18 Jun 2025 15:58:31 +0100
-Subject: btrfs: fix inode lookup error handling during log replay
-
-From: Filipe Manana <fdmanana@suse.com>
-
-[ Upstream commit 5f61b961599acbd2bed028d3089105a1f7d224b8 ]
-
-When replaying log trees we use read_one_inode() to get an inode, which is
-just a wrapper around btrfs_iget_logging(), which in turn is a wrapper for
-btrfs_iget(). But read_one_inode() always returns NULL for any error
-that btrfs_iget_logging() / btrfs_iget() may return and this is a problem
-because:
-
-1) In many callers of read_one_inode() we convert the NULL into -EIO,
- which is not accurate since btrfs_iget() may return -ENOMEM and -ENOENT
- for example, besides -EIO and other errors. So during log replay we
- may end up reporting a false -EIO, which is confusing since we may
- not have had any IO error at all;
-
-2) When replaying directory deletes, at replay_dir_deletes(), we assume
- the NULL returned from read_one_inode() means that the inode doesn't
- exist and then proceed as if no error had happened. This is wrong
- because unless btrfs_iget() returned ERR_PTR(-ENOENT), we had an
- actual error and the target inode may exist in the target subvolume
- root - this may later result in the log replay code failing at a
- later stage (if we are "lucky") or succeed but leaving some
- inconsistency in the filesystem.
-
-So fix this by not ignoring errors from btrfs_iget_logging() and as
-a consequence remove the read_one_inode() wrapper and just use
-btrfs_iget_logging() directly. Also since btrfs_iget_logging() is
-supposed to be called only against subvolume roots, just like
-read_one_inode() which had a comment about it, add an assertion to
-btrfs_iget_logging() to check that the target root corresponds to a
-subvolume root.
-
-Fixes: 5d4f98a28c7d ("Btrfs: Mixed back reference (FORWARD ROLLING FORMAT CHANGE)")
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Reviewed-by: Qu Wenruo <wqu@suse.com>
-Signed-off-by: Filipe Manana <fdmanana@suse.com>
-Signed-off-by: David Sterba <dsterba@suse.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/btrfs/tree-log.c | 139 +++++++++++++++++++++++++-------------------
- 1 file changed, 78 insertions(+), 61 deletions(-)
-
-diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
-index 7049a19e07baf..0ee7ae8f21398 100644
---- a/fs/btrfs/tree-log.c
-+++ b/fs/btrfs/tree-log.c
-@@ -584,18 +584,25 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans,
- return 0;
- }
-
--/*
-- * simple helper to read an inode off the disk from a given root
-- * This can only be called for subvolume roots and not for the log
-- */
--static noinline struct inode *read_one_inode(struct btrfs_root *root,
-- u64 objectid)
-+static struct inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root)
- {
-+ unsigned int nofs_flag;
- struct inode *inode;
-
-+ /* Only meant to be called for subvolume roots and not for log roots. */
-+ ASSERT(is_fstree(btrfs_root_id(root)));
-+
-+ /*
-+ * We're holding a transaction handle whether we are logging or
-+ * replaying a log tree, so we must make sure NOFS semantics apply
-+ * because btrfs_alloc_inode() may be triggered and it uses GFP_KERNEL
-+ * to allocate an inode, which can recurse back into the filesystem and
-+ * attempt a transaction commit, resulting in a deadlock.
-+ */
-+ nofs_flag = memalloc_nofs_save();
- inode = btrfs_iget(root->fs_info->sb, objectid, root);
-- if (IS_ERR(inode))
-- inode = NULL;
-+ memalloc_nofs_restore(nofs_flag);
-+
- return inode;
- }
-
-@@ -652,9 +659,9 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
- goto out;
- }
-
-- inode = read_one_inode(root, key->objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(key->objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
- goto out;
- }
-
-@@ -936,9 +943,9 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
- read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len);
- btrfs_release_path(path);
-
-- inode = read_one_inode(root, location.objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(location.objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
- goto out;
- }
-
-@@ -1173,10 +1180,12 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
- kfree(victim_name);
- return ret;
- } else if (!ret) {
-- ret = -ENOENT;
-- victim_parent = read_one_inode(root,
-- parent_objectid);
-- if (victim_parent) {
-+ victim_parent = btrfs_iget_logging(parent_objectid, root);
-+ if (IS_ERR(victim_parent)) {
-+ ret = PTR_ERR(victim_parent);
-+ kfree(victim_name);
-+ return ret;
-+ } else {
- inc_nlink(&inode->vfs_inode);
- btrfs_release_path(path);
-
-@@ -1333,9 +1342,9 @@ static int unlink_old_inode_refs(struct btrfs_trans_handle *trans,
- struct inode *dir;
-
- btrfs_release_path(path);
-- dir = read_one_inode(root, parent_id);
-- if (!dir) {
-- ret = -ENOENT;
-+ dir = btrfs_iget_logging(parent_id, root);
-+ if (IS_ERR(dir)) {
-+ ret = PTR_ERR(dir);
- kfree(name);
- goto out;
- }
-@@ -1432,9 +1441,9 @@ static int add_link(struct btrfs_trans_handle *trans, struct btrfs_root *root,
- */
- btrfs_dir_item_key_to_cpu(path->nodes[0], dir_item, &key);
- btrfs_release_path(path);
-- other_inode = read_one_inode(root, key.objectid);
-- if (!other_inode) {
-- ret = -ENOENT;
-+ other_inode = btrfs_iget_logging(key.objectid, root);
-+ if (IS_ERR(other_inode)) {
-+ ret = PTR_ERR(other_inode);
- goto out;
- }
- ret = unlink_inode_for_log_replay(trans, BTRFS_I(dir), BTRFS_I(other_inode),
-@@ -1506,15 +1515,17 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
- * copy the back ref in. The link count fixup code will take
- * care of the rest
- */
-- dir = read_one_inode(root, parent_objectid);
-- if (!dir) {
-- ret = -ENOENT;
-+ dir = btrfs_iget_logging(parent_objectid, root);
-+ if (IS_ERR(dir)) {
-+ ret = PTR_ERR(dir);
-+ dir = NULL;
- goto out;
- }
-
-- inode = read_one_inode(root, inode_objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(inode_objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
-+ inode = NULL;
- goto out;
- }
-
-@@ -1526,11 +1537,13 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
- * parent object can change from one array
- * item to another.
- */
-- if (!dir)
-- dir = read_one_inode(root, parent_objectid);
- if (!dir) {
-- ret = -ENOENT;
-- goto out;
-+ dir = btrfs_iget_logging(parent_objectid, root);
-+ if (IS_ERR(dir)) {
-+ ret = PTR_ERR(dir);
-+ dir = NULL;
-+ goto out;
-+ }
- }
- } else {
- ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
-@@ -1834,9 +1847,9 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
- break;
-
- btrfs_release_path(path);
-- inode = read_one_inode(root, key.offset);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(key.offset, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
- break;
- }
-
-@@ -1871,9 +1884,9 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
- int ret = 0;
- struct inode *inode;
-
-- inode = read_one_inode(root, objectid);
-- if (!inode)
-- return -EIO;
-+ inode = btrfs_iget_logging(objectid, root);
-+ if (IS_ERR(inode))
-+ return PTR_ERR(inode);
-
- key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
- key.type = BTRFS_ORPHAN_ITEM_KEY;
-@@ -1911,14 +1924,14 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans,
- struct inode *dir;
- int ret;
-
-- inode = read_one_inode(root, location->objectid);
-- if (!inode)
-- return -ENOENT;
-+ inode = btrfs_iget_logging(location->objectid, root);
-+ if (IS_ERR(inode))
-+ return PTR_ERR(inode);
-
-- dir = read_one_inode(root, dirid);
-- if (!dir) {
-+ dir = btrfs_iget_logging(dirid, root);
-+ if (IS_ERR(dir)) {
- iput(inode);
-- return -EIO;
-+ return PTR_ERR(dir);
- }
-
- ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), name,
-@@ -1966,9 +1979,9 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
- bool update_size = (key->type == BTRFS_DIR_INDEX_KEY);
- bool name_added = false;
-
-- dir = read_one_inode(root, key->objectid);
-- if (!dir)
-- return -EIO;
-+ dir = btrfs_iget_logging(key->objectid, root);
-+ if (IS_ERR(dir))
-+ return PTR_ERR(dir);
-
- name_len = btrfs_dir_name_len(eb, di);
- name = kmalloc(name_len, GFP_NOFS);
-@@ -2318,9 +2331,10 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans,
- btrfs_dir_item_key_to_cpu(eb, di, &location);
- btrfs_release_path(path);
- btrfs_release_path(log_path);
-- inode = read_one_inode(root, location.objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(location.objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
-+ inode = NULL;
- goto out;
- }
-
-@@ -2472,14 +2486,17 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
- if (!log_path)
- return -ENOMEM;
-
-- dir = read_one_inode(root, dirid);
-- /* it isn't an error if the inode isn't there, that can happen
-- * because we replay the deletes before we copy in the inode item
-- * from the log
-+ dir = btrfs_iget_logging(dirid, root);
-+ /*
-+ * It isn't an error if the inode isn't there, that can happen because
-+ * we replay the deletes before we copy in the inode item from the log.
- */
-- if (!dir) {
-+ if (IS_ERR(dir)) {
- btrfs_free_path(log_path);
-- return 0;
-+ ret = PTR_ERR(dir);
-+ if (ret == -ENOENT)
-+ ret = 0;
-+ return ret;
- }
-
- range_start = 0;
-@@ -2634,9 +2651,9 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,
- struct inode *inode;
- u64 from;
-
-- inode = read_one_inode(root, key.objectid);
-- if (!inode) {
-- ret = -EIO;
-+ inode = btrfs_iget_logging(key.objectid, root);
-+ if (IS_ERR(inode)) {
-+ ret = PTR_ERR(inode);
- break;
- }
- from = ALIGN(i_size_read(inode),
---
-2.39.5
-
usb-cdnsp-replace-snprintf-with-the-safer-scnprintf-.patch
usb-cdnsp-fix-issue-with-cv-bad-descriptor-test.patch
usb-dwc3-abort-suspend-on-soft-disconnect-failure.patch
-smb-client-fix-readdir-returning-wrong-type-with-pos.patch
dma-buf-add-dma_resv_for_each_fence_unlocked-v8.patch
dma-buf-use-new-iterator-in-dma_resv_wait_timeout.patch
dma-buf-fix-timeout-handling-in-dma_resv_wait_timeou.patch
platform-x86-think-lmi-fix-sysfs-group-cleanup.patch
-btrfs-fix-inode-lookup-error-handling-during-log-rep.patch
wifi-zd1211rw-fix-potential-null-pointer-dereference.patch
md-raid1-fix-stack-memory-use-after-return-in-raid1_.patch
raid10-cleanup-memleak-at-raid10_make_request.patch
hid-add-ignore-quirk-for-smartlinktechnology.patch
hid-quirks-add-quirk-for-2-chicony-electronics-hp-5m.patch
input-atkbd-do-not-skip-atkbd_deactivate-when-skipping-atkbd_cmd_getid.patch
+vhost-scsi-protect-vq-log_used-with-vq-mutex.patch
+x86-mm-disable-hugetlb-page-table-sharing-on-32-bit.patch
+x86-fix-x86_feature_verw_clear-definition.patch
+++ /dev/null
-From e0a5ae8bdad18a7b15daf2cd56ef88c44925427f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 12 Jul 2025 03:52:17 -0400
-Subject: smb: client: fix readdir returning wrong type with POSIX extensions
-
-From: Philipp Kerling <pkerling@casix.org>
-
-[ Upstream commit b8f89cb723b9e66f5dbd7199e4036fee34fb0de0 ]
-
-When SMB 3.1.1 POSIX Extensions are negotiated, userspace applications
-using readdir() or getdents() calls without stat() on each individual file
-(such as a simple "ls" or "find") would misidentify file types and exhibit
-strange behavior such as not descending into directories. The reason for
-this behavior is an oversight in the cifs_posix_to_fattr conversion
-function. Instead of extracting the entry type for cf_dtype from the
-properly converted cf_mode field, it tries to extract the type from the
-PDU. While the wire representation of the entry mode is similar in
-structure to POSIX stat(), the assignments of the entry types are
-different. Applying the S_DT macro to cf_mode instead yields the correct
-result. This is also what the equivalent function
-smb311_posix_info_to_fattr in inode.c already does for stat() etc.; which
-is why "ls -l" would give the correct file type but "ls" would not (as
-identified by the colors).
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Philipp Kerling <pkerling@casix.org>
-Signed-off-by: Steve French <stfrench@microsoft.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/cifs/readdir.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
-index 6aa3c267f4ca4..6512fece737ed 100644
---- a/fs/cifs/readdir.c
-+++ b/fs/cifs/readdir.c
-@@ -262,7 +262,6 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info,
-
- if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
- fattr->cf_mode |= S_IFDIR;
-- fattr->cf_dtype = DT_DIR;
- } else {
- /*
- * mark anything that is not a dir as regular
-@@ -270,8 +269,8 @@ cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info,
- * attribute and will be marked as needing revaluation
- */
- fattr->cf_mode |= S_IFREG;
-- fattr->cf_dtype = DT_REG;
- }
-+ fattr->cf_dtype = S_DT(fattr->cf_mode);
-
- if (reparse_file_needs_reval(fattr))
- fattr->cf_flags |= CIFS_FATTR_NEED_REVAL;
---
-2.39.5
-
hid-add-ignore-quirk-for-smartlinktechnology.patch
hid-quirks-add-quirk-for-2-chicony-electronics-hp-5m.patch
input-atkbd-do-not-skip-atkbd_deactivate-when-skipping-atkbd_cmd_getid.patch
+vhost-scsi-protect-vq-log_used-with-vq-mutex.patch
+x86-mm-disable-hugetlb-page-table-sharing-on-32-bit.patch
+x86-fix-x86_feature_verw_clear-definition.patch
+kasan-remove-kasan_find_vm_area-to-prevent-possible-deadlock.patch
+ksmbd-fix-potential-use-after-free-in-oplock-lease-break-ack.patch