]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: libsas: Check SMP PHY control function result
authorJohn Garry <john.garry@huawei.com>
Fri, 4 Jan 2019 16:01:27 +0000 (00:01 +0800)
committerMarcelo Henrique Cerri <marcelo.cerri@canonical.com>
Fri, 17 Jan 2020 17:21:42 +0000 (14:21 -0300)
BugLink: https://bugs.launchpad.net/bugs/1855787
[ Upstream commit 01929a65dfa13e18d89264ab1378854a91857e59 ]

Currently the SMP PHY control execution result is checked, however the
function result for the command is not.

As such, we may be missing all potential errors, like SMP FUNCTION FAILED,
INVALID REQUEST FRAME LENGTH, etc., meaning the PHY control request has
failed.

In some scenarios we need to ensure the function result is accepted, so add
a check for this.

Tested-by: Jian Luo <luojian5@huawei.com>
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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/scsi/libsas/sas_expander.c

index f898e119965da36f4a24d16cc23772f1a1af76cb..70f5690e272dec3de83ec4662c72933d36fee386 100644 (file)
@@ -614,7 +614,14 @@ int sas_smp_phy_control(struct domain_device *dev, int phy_id,
        }
 
        res = smp_execute_task(dev, pc_req, PC_REQ_SIZE, pc_resp,PC_RESP_SIZE);
-
+       if (res) {
+               pr_err("ex %016llx phy%02d PHY control failed: %d\n",
+                      SAS_ADDR(dev->sas_addr), phy_id, res);
+       } else if (pc_resp[2] != SMP_RESP_FUNC_ACC) {
+               pr_err("ex %016llx phy%02d PHY control failed: function result 0x%x\n",
+                      SAS_ADDR(dev->sas_addr), phy_id, pc_resp[2]);
+               res = pc_resp[2];
+       }
        kfree(pc_resp);
        kfree(pc_req);
        return res;