aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libsas/sas_expander.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/libsas/sas_expander.c')
-rw-r--r--drivers/scsi/libsas/sas_expander.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index 8817b8e6e507..83e3715d30e4 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -824,6 +824,26 @@ static struct domain_device *sas_ex_discover_end_dev(
824 824
825#ifdef CONFIG_SCSI_SAS_ATA 825#ifdef CONFIG_SCSI_SAS_ATA
826 if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) { 826 if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
827 if (child->linkrate > parent->min_linkrate) {
828 struct sas_phy_linkrates rates = {
829 .maximum_linkrate = parent->min_linkrate,
830 .minimum_linkrate = parent->min_linkrate,
831 };
832 int ret;
833
834 pr_notice("ex %016llx phy%02d SATA device linkrate > min pathway connection rate, attempting to lower device linkrate\n",
835 SAS_ADDR(child->sas_addr), phy_id);
836 ret = sas_smp_phy_control(parent, phy_id,
837 PHY_FUNC_LINK_RESET, &rates);
838 if (ret) {
839 pr_err("ex %016llx phy%02d SATA device could not set linkrate (%d)\n",
840 SAS_ADDR(child->sas_addr), phy_id, ret);
841 goto out_free;
842 }
843 pr_notice("ex %016llx phy%02d SATA device set linkrate successfully\n",
844 SAS_ADDR(child->sas_addr), phy_id);
845 child->linkrate = child->min_linkrate;
846 }
827 res = sas_get_ata_info(child, phy); 847 res = sas_get_ata_info(child, phy);
828 if (res) 848 if (res)
829 goto out_free; 849 goto out_free;