From: Xingui Yang <yangxingui@huawei.com>
To: <john.g.garry@oracle.com>, <yanaijie@huawei.com>,
<jejb@linux.ibm.com>, <martin.petersen@oracle.com>
Cc: <linux-scsi@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linuxarm@huawei.com>, <liyihang9@h-partners.com>,
<yangxingui@huawei.com>, <liuyonglong@huawei.com>,
<kangfenglong@huawei.com>
Subject: [PATCH v2 2/3] scsi: libsas: add lldd_dev_info_update callback for device info changes
Date: Wed, 13 May 2026 10:16:02 +0800 [thread overview]
Message-ID: <20260513021603.3023329-3-yangxingui@huawei.com> (raw)
In-Reply-To: <20260513021603.3023329-1-yangxingui@huawei.com>
When a device attached to an expander phy experiences a linkrate change
(e.g., due to cable reconnection or negotiation), the current code in
sas_rediscover_dev() treats it as "broadcast flutter" and takes no action
if the SAS address and device type remain unchanged.
However, for drivers like hisi_sas, the ITCT entry needs to be updated
to reflect the new linkrate. Without this update, the hardware continues
using stale linkrate information, which can cause performance issues or
protocol errors.
Introduce a new LLDD callback lldd_dev_info_update() to notify the
low-level driver when a device's information changes (such as linkrate),
allowing the driver to update its hardware structures accordingly. This
callback is designed to be extensible for future device information
updates.
Signed-off-by: Xingui Yang <yangxingui@huawei.com>
---
drivers/scsi/libsas/sas_discover.c | 12 ++++++++++++
drivers/scsi/libsas/sas_expander.c | 13 +++++++++++--
drivers/scsi/libsas/sas_internal.h | 1 +
include/scsi/libsas.h | 1 +
4 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
index b07062db50b2..60be59c45508 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -204,6 +204,18 @@ void sas_notify_lldd_dev_gone(struct domain_device *dev)
}
}
+void sas_notify_lldd_dev_info_update(struct domain_device *dev)
+{
+ struct sas_ha_struct *sas_ha = dev->port->ha;
+ struct Scsi_Host *shost = sas_ha->shost;
+ struct sas_internal *i = to_sas_internal(shost->transportt);
+
+ if (!i->dft->lldd_dev_info_update)
+ return;
+
+ i->dft->lldd_dev_info_update(dev);
+}
+
static void sas_probe_devices(struct asd_sas_port *port)
{
struct domain_device *dev, *n;
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index f55ae9a979cd..11165ba585b2 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -2017,13 +2017,22 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id,
goto out_free_resp;
} else if (SAS_ADDR(sas_addr) == SAS_ADDR(phy->attached_sas_addr) &&
dev_type_flutter(type, phy->attached_dev_type)) {
- struct domain_device *ata_dev = sas_ex_to_ata(dev, phy_id);
+ struct domain_device *child_dev = sas_ex_to_dev(dev, phy_id);
char *action = "";
sas_ex_phy_discover(dev, phy_id);
- if (ata_dev && phy->attached_dev_type == SAS_SATA_PENDING)
+ if (child_dev && dev_is_sata(child_dev) &&
+ phy->attached_dev_type == SAS_SATA_PENDING) {
action = ", needs recovery";
+ } else if (child_dev && child_dev->linkrate != phy->linkrate) {
+ pr_debug("ex %016llx phy%02d linkrate changed: %d -> %d\n",
+ SAS_ADDR(dev->sas_addr), phy_id,
+ child_dev->linkrate, phy->linkrate);
+ child_dev->linkrate = phy->linkrate;
+ sas_notify_lldd_dev_info_update(child_dev);
+ }
+
pr_debug("ex %016llx phy%02d broadcast flutter%s\n",
SAS_ADDR(dev->sas_addr), phy_id, action);
goto out_free_resp;
diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h
index 350a70484bde..9ee37b8abd78 100644
--- a/drivers/scsi/libsas/sas_internal.h
+++ b/drivers/scsi/libsas/sas_internal.h
@@ -82,6 +82,7 @@ bool sas_queue_work(struct sas_ha_struct *ha, struct sas_work *sw);
int sas_notify_lldd_dev_found(struct domain_device *);
void sas_notify_lldd_dev_gone(struct domain_device *);
+void sas_notify_lldd_dev_info_update(struct domain_device *dev);
void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
struct sas_rphy *rphy);
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
index 163f23c92b41..973b4445b7e0 100644
--- a/include/scsi/libsas.h
+++ b/include/scsi/libsas.h
@@ -674,6 +674,7 @@ struct sas_domain_function_template {
/* GPIO support */
int (*lldd_write_gpio)(struct sas_ha_struct *, u8 reg_type,
u8 reg_index, u8 reg_count, u8 *write_data);
+ void (*lldd_dev_info_update)(struct domain_device *dev);
};
extern int sas_register_ha(struct sas_ha_struct *);
--
2.43.0
next prev parent reply other threads:[~2026-05-13 2:17 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 2:16 [PATCH v2 0/3] scsi: libsas: handle linkrate change in sas_rediscover_dev Xingui Yang
2026-05-13 2:16 ` [PATCH v2 1/3] scsi: libsas: refactor sas_ex_to_ata() using new helper sas_ex_to_dev() Xingui Yang
2026-05-13 6:18 ` Jason Yan
2026-05-13 2:16 ` Xingui Yang [this message]
2026-05-13 6:22 ` [PATCH v2 2/3] scsi: libsas: add lldd_dev_info_update callback for device info changes Jason Yan
2026-05-13 2:16 ` [PATCH v2 3/3] scsi: hisi_sas: add support for dev info update notification Xingui Yang
2026-05-13 6:23 ` Jason Yan
2026-05-13 7:29 ` [PATCH v2 0/3] scsi: libsas: handle linkrate change in sas_rediscover_dev John Garry
2026-05-13 8:14 ` yangxingui
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260513021603.3023329-3-yangxingui@huawei.com \
--to=yangxingui@huawei.com \
--cc=jejb@linux.ibm.com \
--cc=john.g.garry@oracle.com \
--cc=kangfenglong@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=liuyonglong@huawei.com \
--cc=liyihang9@h-partners.com \
--cc=martin.petersen@oracle.com \
--cc=yanaijie@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox