Driver ->power_on and ->power_off callbacks leaks internal SMCC firmware
return codes to phy caller. This patch converts SMCC error codes to
standard linux errno codes. Include file linux/arm-smccc.h already provides
defines for SMCC error codes, so use them instead of custom driver defines.
Note that return value is signed 32bit, but stored in unsigned long type
with zero padding.

Signed-off-by: Pali Rohár <p...@kernel.org>
---
 drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 14 +++++++++++---
 drivers/phy/marvell/phy-mvebu-cp110-comphy.c | 14 +++++++++++---
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c 
b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
index 1a138be8bd6a..810f25a47632 100644
--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
@@ -26,7 +26,6 @@
 #define COMPHY_SIP_POWER_ON                    0x82000001
 #define COMPHY_SIP_POWER_OFF                   0x82000002
 #define COMPHY_SIP_PLL_LOCK                    0x82000003
-#define COMPHY_FW_NOT_SUPPORTED                        (-1)
 
 #define COMPHY_FW_MODE_SATA                    0x1
 #define COMPHY_FW_MODE_SGMII                   0x2
@@ -112,10 +111,19 @@ static int mvebu_a3700_comphy_smc(unsigned long function, 
unsigned long lane,
                                  unsigned long mode)
 {
        struct arm_smccc_res res;
+       s32 ret;
 
        arm_smccc_smc(function, lane, mode, 0, 0, 0, 0, 0, &res);
+       ret = res.a0;
 
-       return res.a0;
+       switch (ret) {
+       case SMCCC_RET_SUCCESS:
+               return 0;
+       case SMCCC_RET_NOT_SUPPORTED:
+               return -EOPNOTSUPP;
+       default:
+               return -EINVAL;
+       }
 }
 
 static int mvebu_a3700_comphy_get_fw_mode(int lane, int port,
@@ -220,7 +228,7 @@ static int mvebu_a3700_comphy_power_on(struct phy *phy)
        }
 
        ret = mvebu_a3700_comphy_smc(COMPHY_SIP_POWER_ON, lane->id, fw_param);
-       if (ret == COMPHY_FW_NOT_SUPPORTED)
+       if (ret == -EOPNOTSUPP)
                dev_err(lane->dev,
                        "unsupported SMC call, try updating your firmware\n");
 
diff --git a/drivers/phy/marvell/phy-mvebu-cp110-comphy.c 
b/drivers/phy/marvell/phy-mvebu-cp110-comphy.c
index e41367f36ee1..53ad127b100f 100644
--- a/drivers/phy/marvell/phy-mvebu-cp110-comphy.c
+++ b/drivers/phy/marvell/phy-mvebu-cp110-comphy.c
@@ -123,7 +123,6 @@
 
 #define COMPHY_SIP_POWER_ON    0x82000001
 #define COMPHY_SIP_POWER_OFF   0x82000002
-#define COMPHY_FW_NOT_SUPPORTED        (-1)
 
 /*
  * A lane is described by the following bitfields:
@@ -273,10 +272,19 @@ static int mvebu_comphy_smc(unsigned long function, 
unsigned long phys,
                            unsigned long lane, unsigned long mode)
 {
        struct arm_smccc_res res;
+       s32 ret;
 
        arm_smccc_smc(function, phys, lane, mode, 0, 0, 0, 0, &res);
+       ret = res.a0;
 
-       return res.a0;
+       switch (ret) {
+       case SMCCC_RET_SUCCESS:
+               return 0;
+       case SMCCC_RET_NOT_SUPPORTED:
+               return -EOPNOTSUPP;
+       default:
+               return -EINVAL;
+       }
 }
 
 static int mvebu_comphy_get_mode(bool fw_mode, int lane, int port,
@@ -819,7 +827,7 @@ static int mvebu_comphy_power_on(struct phy *phy)
        if (!ret)
                return ret;
 
-       if (ret == COMPHY_FW_NOT_SUPPORTED)
+       if (ret == -EOPNOTSUPP)
                dev_err(priv->dev,
                        "unsupported SMC call, try updating your firmware\n");
 
-- 
2.20.1

Reply via email to