lkml.org 
[lkml]   [2019]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.9 09/87] scsi: hisi_sas: Set PHY linkrate when disconnected
    Date
    From: John Garry <john.garry@huawei.com>

    [ Upstream commit efdcad62e7b8a02fcccc5ccca57806dce1482ac8 ]

    When the PHY comes down, we currently do not set the negotiated linkrate:

    root@(none)$ pwd
    /sys/class/sas_phy/phy-0:0
    root@(none)$ more enable
    1
    root@(none)$ more negotiated_linkrate
    12.0 Gbit
    root@(none)$ echo 0 > enable
    root@(none)$ more negotiated_linkrate
    12.0 Gbit
    root@(none)$

    This patch fixes the driver code to set it properly when the PHY comes
    down.

    If the PHY had been enabled, then set unknown; otherwise, flag as disabled.

    The logical place to set the negotiated linkrate for this scenario is PHY
    down routine, which is called from the PHY down ISR.

    However, it is not possible to know if the PHY comes down due to PHY
    disable or loss of link, as sas_phy.enabled member is not set until after
    the transport disable routine is complete, which races with the PHY down
    ISR.

    As an imperfect solution, use sas_phy_data.enable as the flag to know if
    the PHY is down due to disable. It's imperfect, as sas_phy_data is internal
    to libsas.

    I can't see another way without adding a new field to hisi_sas_phy and
    managing it, or changing SCSI SAS transport.

    Signed-off-by: John Garry <john.garry@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/hisi_sas/hisi_sas_main.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
    index 2f872f784e10..5252dd5d3f4b 100644
    --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
    +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
    @@ -10,6 +10,7 @@
    */

    #include "hisi_sas.h"
    +#include "../libsas/sas_internal.h"
    #define DRV_NAME "hisi_sas"

    #define DEV_IS_GONE(dev) \
    @@ -1128,9 +1129,18 @@ static void hisi_sas_port_deformed(struct asd_sas_phy *sas_phy)

    static void hisi_sas_phy_disconnected(struct hisi_sas_phy *phy)
    {
    + struct asd_sas_phy *sas_phy = &phy->sas_phy;
    + struct sas_phy *sphy = sas_phy->phy;
    + struct sas_phy_data *d = sphy->hostdata;
    +
    phy->phy_attached = 0;
    phy->phy_type = 0;
    phy->port = NULL;
    +
    + if (d->enable)
    + sphy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
    + else
    + sphy->negotiated_linkrate = SAS_PHY_DISABLED;
    }

    void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy)
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-27 19:22    [W:6.462 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site