diff options
Diffstat (limited to 'drivers/scsi/libsas/sas_expander.c')
-rw-r--r-- | drivers/scsi/libsas/sas_expander.c | 20 |
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; |