scsi: libsas: Try to retain programmed min linkrate for SATA min pathway unmatch...
authorJohn Garry <john.garry@huawei.com>
Fri, 12 Apr 2019 08:57:53 +0000 (16:57 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 15 Apr 2019 22:55:00 +0000 (18:55 -0400)
Currently for fixing the linkrate matching during discovery such that the
linkrate of a SATA PHY does not exceed min pathway to initiator, we set the
SATA PHY programmed min linkrate to the same value as the programmed max
linkrate.

This is unnecessary, and we should be able to keep the same programmed min
linkrate if it is already lower than this new max programmed linkrate.

This patch makes that change.

In effect, this will not make much difference since we generally will
negotiate a linkrate at the programmed max linkrate, and the programmed min
linkrate will have no impact.

Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/libsas/sas_expander.c

index 93f297199d4c09d052d4db58cee6f3c4b1f0d294..dfdf3c94d326e7995c2481778b228e6569f18c49 100644 (file)
@@ -826,9 +826,14 @@ static struct domain_device *sas_ex_discover_end_dev(
 #ifdef CONFIG_SCSI_SAS_ATA
        if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
                if (child->linkrate > parent->min_linkrate) {
+                       struct sas_phy *cphy = child->phy;
+                       enum sas_linkrate min_prate = cphy->minimum_linkrate,
+                               parent_min_lrate = parent->min_linkrate,
+                               min_linkrate = (min_prate > parent_min_lrate) ?
+                                              parent_min_lrate : 0;
                        struct sas_phy_linkrates rates = {
                                .maximum_linkrate = parent->min_linkrate,
-                               .minimum_linkrate = parent->min_linkrate,
+                               .minimum_linkrate = min_linkrate,
                        };
                        int ret;