Introduce helper functions to perform external PHY register read and
write operations. These helpers currently support only IEEE Clause 22
PHY access, providing a simple and consistent API for accessing
standard 16‑bit MII registers on external PHY devices.

Signed-off-by: Ashok Kumar Natarajan <[email protected]>
---
 .mailmap                           |  1 +
 drivers/net/axgbe/axgbe_dev.c      | 56 ++++++++++++++++--------------
 drivers/net/axgbe/axgbe_ethdev.h   | 16 ++++++---
 drivers/net/axgbe/axgbe_phy_impl.c | 45 +++++++++++++++++++++++-
 4 files changed, 85 insertions(+), 33 deletions(-)

diff --git a/.mailmap b/.mailmap
index 6c4c977dde..5c8b47f1a9 100644
--- a/.mailmap
+++ b/.mailmap
@@ -165,6 +165,7 @@ Ashish Paul <[email protected]>
 Ashish Sadanandan <[email protected]>
 Ashish Shah <[email protected]>
 Ashok Kaladi <[email protected]>
+Ashok Kumar Natarajan <[email protected]>
 Ashwin Sekhar T K <[email protected]> <[email protected]>
 Asim Jamshed <[email protected]>
 Atul Patel <[email protected]>
diff --git a/drivers/net/axgbe/axgbe_dev.c b/drivers/net/axgbe/axgbe_dev.c
index 634d4ee4a5..10a99aeac2 100644
--- a/drivers/net/axgbe/axgbe_dev.c
+++ b/drivers/net/axgbe/axgbe_dev.c
@@ -63,9 +63,9 @@ static int mdio_complete(struct axgbe_port *pdata)
        return 0;
 }
 
-static unsigned int axgbe_create_mdio_sca_c22(int port, int reg)
+static unsigned int axgbe_create_mdio_sca_c22(u8 port, u16 reg)
 {
-       unsigned int mdio_sca;
+       u32 mdio_sca;
 
        mdio_sca = 0;
        AXGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, RA, reg);
@@ -74,20 +74,20 @@ static unsigned int axgbe_create_mdio_sca_c22(int port, int 
reg)
        return mdio_sca;
 }
 
-static unsigned int axgbe_create_mdio_sca_c45(int port, unsigned int da, int 
reg)
+static unsigned int axgbe_create_mdio_sca_c45(u8 port, u8 dev_addr, u16 reg)
 {
-       unsigned int mdio_sca;
+       u32 mdio_sca;
 
        mdio_sca = 0;
        AXGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, RA, reg);
        AXGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, PA, port);
-       AXGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, DA, da);
+       AXGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, DA, dev_addr);
 
        return mdio_sca;
 }
 
 static int axgbe_write_ext_mii_regs(struct axgbe_port *pdata,
-                                               unsigned int mdio_sca, u16 val)
+               u32 mdio_sca, u16 value)
 {
        unsigned int mdio_sccd;
        uint64_t timeout;
@@ -95,7 +95,7 @@ static int axgbe_write_ext_mii_regs(struct axgbe_port *pdata,
        AXGMAC_IOWRITE(pdata, MAC_MDIOSCAR, mdio_sca);
 
        mdio_sccd = 0;
-       AXGMAC_SET_BITS(mdio_sccd, MAC_MDIOSCCDR, DATA, val);
+       AXGMAC_SET_BITS(mdio_sccd, MAC_MDIOSCCDR, DATA, value);
        AXGMAC_SET_BITS(mdio_sccd, MAC_MDIOSCCDR, CMD, 1);
        AXGMAC_SET_BITS(mdio_sccd, MAC_MDIOSCCDR, BUSY, 1);
        AXGMAC_IOWRITE(pdata, MAC_MDIOSCCDR, mdio_sccd);
@@ -113,28 +113,28 @@ static int axgbe_write_ext_mii_regs(struct axgbe_port 
*pdata,
 
 
 static int axgbe_write_ext_mii_regs_c22(struct axgbe_port *pdata,
-                                                       int addr, int reg, u16 
val)
+               u8 phy_addr, u16 reg, u16 value)
 {
-       unsigned int mdio_sca;
+       u32 mdio_sca;
 
-       mdio_sca = axgbe_create_mdio_sca_c22(addr, reg);
+       mdio_sca = axgbe_create_mdio_sca_c22(phy_addr, reg);
 
-       return axgbe_write_ext_mii_regs(pdata, mdio_sca, val);
+       return axgbe_write_ext_mii_regs(pdata, mdio_sca, value);
 }
 
 static int axgbe_write_ext_mii_regs_c45(struct axgbe_port *pdata,
-                                       int addr, int devad, int reg, u16 val)
+              u8 phy_addr, u8 dev_addr, u16 reg, u16 value)
 {
-       unsigned int mdio_sca;
+       u32 mdio_sca;
 
-       mdio_sca = axgbe_create_mdio_sca_c45(addr, devad, reg);
+       mdio_sca = axgbe_create_mdio_sca_c45(phy_addr, dev_addr, reg);
 
-       return axgbe_write_ext_mii_regs(pdata, mdio_sca, val);
+       return axgbe_write_ext_mii_regs(pdata, mdio_sca, value);
 }
 
 
-static int axgbe_read_ext_mii_regs(struct axgbe_port *pdata,
-                                                       unsigned int mdio_sca)
+static int axgbe_read_ext_mii_regs(struct axgbe_port *pdata, u32 mdio_sca,
+               u16 *value)
 {
        unsigned int mdio_sccd;
        uint64_t timeout;
@@ -158,26 +158,28 @@ static int axgbe_read_ext_mii_regs(struct axgbe_port 
*pdata,
        return -ETIMEDOUT;
 
 success:
-       return AXGMAC_IOREAD_BITS(pdata, MAC_MDIOSCCDR, DATA);
+       *value = AXGMAC_IOREAD_BITS(pdata, MAC_MDIOSCCDR, DATA);
+       return 0;
 }
 
-static int axgbe_read_ext_mii_regs_c22(struct axgbe_port *pdata, int addr, int 
reg)
+static int axgbe_read_ext_mii_regs_c22(struct axgbe_port *pdata, u8 phy_addr,
+               u16 reg, u16 *value)
 {
-       unsigned int mdio_sca;
+       u32 mdio_sca;
 
-       mdio_sca = axgbe_create_mdio_sca_c22(addr, reg);
+       mdio_sca = axgbe_create_mdio_sca_c22(phy_addr, reg);
 
-       return axgbe_read_ext_mii_regs(pdata, mdio_sca);
+       return axgbe_read_ext_mii_regs(pdata, mdio_sca, value);
 }
 
-static int axgbe_read_ext_mii_regs_c45(struct axgbe_port *pdata, int addr,
-                                                               int devad, int 
reg)
+static int axgbe_read_ext_mii_regs_c45(struct axgbe_port *pdata, u8 phy_addr,
+               u8 dev_addr, u16 reg, u16 *value)
 {
-       unsigned int mdio_sca;
+       u32 mdio_sca;
 
-       mdio_sca = axgbe_create_mdio_sca_c45(addr, devad, reg);
+       mdio_sca = axgbe_create_mdio_sca_c45(phy_addr, dev_addr, reg);
 
-       return axgbe_read_ext_mii_regs(pdata, mdio_sca);
+       return axgbe_read_ext_mii_regs(pdata, mdio_sca, value);
 }
 
 static int axgbe_set_ext_mii_mode(struct axgbe_port *pdata, unsigned int port,
diff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h
index b94a7f3562..24336f31f6 100644
--- a/drivers/net/axgbe/axgbe_ethdev.h
+++ b/drivers/net/axgbe/axgbe_ethdev.h
@@ -327,11 +327,14 @@ struct axgbe_hw_if {
 
        int (*set_ext_mii_mode)(struct axgbe_port *, unsigned int,
                                enum axgbe_mdio_mode);
-       int (*read_ext_mii_regs_c22)(struct axgbe_port *pdata, int addr, int 
reg);
-       int (*write_ext_mii_regs_c22)(struct axgbe_port *pdata, int addr, int 
reg, uint16_t val);
-       int (*read_ext_mii_regs_c45)(struct axgbe_port *pdata, int addr, int 
devad, int reg);
-       int (*write_ext_mii_regs_c45)(struct axgbe_port *pdata, int addr, int 
devad,
-                                                                       int 
reg, uint16_t val);
+       int (*read_ext_mii_regs_c22)(struct axgbe_port *pdata, u8 phy_addr,
+                       u16 reg, u16 *value);
+       int (*write_ext_mii_regs_c22)(struct axgbe_port *pdata, u8 phy_addr,
+                       u16 reg, u16 value);
+       int (*read_ext_mii_regs_c45)(struct axgbe_port *pdata, u8 phy_addr,
+                       u8 dev_addr, u16 reg, u16 *value);
+       int (*write_ext_mii_regs_c45)(struct axgbe_port *pdata, u8 phy_addr,
+                       u8 dev_addr, u16 reg, u16 value);
 
        /* For FLOW ctrl */
        int (*config_tx_flow_control)(struct axgbe_port *);
@@ -398,6 +401,9 @@ struct axgbe_phy_impl_if {
        /* Pre/Post KR training enablement support */
        void (*kr_training_pre)(struct axgbe_port *);
        void (*kr_training_post)(struct axgbe_port *);
+
+       int (*read)(struct axgbe_port *pdata, u16 reg, u16 *value);
+       int (*write)(struct axgbe_port *pdata, u16 reg, u16 value);
 };
 
 struct axgbe_phy_if {
diff --git a/drivers/net/axgbe/axgbe_phy_impl.c 
b/drivers/net/axgbe/axgbe_phy_impl.c
index 9249e11335..cbab2908b4 100644
--- a/drivers/net/axgbe/axgbe_phy_impl.c
+++ b/drivers/net/axgbe/axgbe_phy_impl.c
@@ -203,7 +203,7 @@ struct axgbe_phy_data {
 
        unsigned int rrc_count;
 
-       unsigned int mdio_addr;
+       uint8_t mdio_addr;
 
        /* SFP Support */
        enum axgbe_sfp_comm sfp_comm;
@@ -251,6 +251,8 @@ static void axgbe_phy_perform_ratechange(struct axgbe_port 
*pdata,
                enum axgbe_mb_cmd cmd, enum axgbe_mb_subcmd sub_cmd);
 static void axgbe_phy_rrc(struct axgbe_port *pdata);
 
+static int axgbe_phy_get_comm_ownership(struct axgbe_port *pdata);
+static void axgbe_phy_put_comm_ownership(struct axgbe_port *pdata);
 
 static int axgbe_phy_i2c_xfer(struct axgbe_port *pdata,
                              struct axgbe_i2c_op *i2c_op)
@@ -258,6 +260,44 @@ static int axgbe_phy_i2c_xfer(struct axgbe_port *pdata,
        return pdata->i2c_if.i2c_xfer(pdata, i2c_op);
 }
 
+static int axgbe_phy_read(struct axgbe_port *pdata, u16 reg, u16 *value)
+{
+       struct axgbe_phy_data *phy_data = pdata->phy_data;
+       int ret;
+
+       ret = axgbe_phy_get_comm_ownership(pdata);
+       if (ret)
+               return ret;
+
+       ret = pdata->hw_if.read_ext_mii_regs_c22(pdata,
+                       phy_data->mdio_addr, reg, value);
+       if (ret)
+               PMD_DRV_LOG_LINE(ERR, "mdio read failed %s",
+                               strerror(-ret));
+
+       axgbe_phy_put_comm_ownership(pdata);
+       return ret;
+}
+
+static int axgbe_phy_write(struct axgbe_port *pdata, u16 reg, u16 value)
+{
+       struct axgbe_phy_data *phy_data = pdata->phy_data;
+       int ret;
+       ret = axgbe_phy_get_comm_ownership(pdata);
+       if (ret)
+               return ret;
+
+       ret = pdata->hw_if.write_ext_mii_regs_c22(pdata,
+                       phy_data->mdio_addr, reg, value);
+       if (ret)
+               PMD_DRV_LOG_LINE(ERR, "mdio write failed %s",
+                               strerror(-ret));
+
+       axgbe_phy_put_comm_ownership(pdata);
+       return ret;
+}
+
+
 static int axgbe_phy_redrv_write(struct axgbe_port *pdata, unsigned int reg,
                                 unsigned int val)
 {
@@ -2542,4 +2582,7 @@ void axgbe_init_function_ptrs_phy_v2(struct axgbe_phy_if 
*phy_if)
 
        phy_impl->kr_training_pre       = axgbe_phy_kr_training_pre;
        phy_impl->kr_training_post      = axgbe_phy_kr_training_post;
+
+       phy_impl->read                  = axgbe_phy_read;
+       phy_impl->write                 = axgbe_phy_write;
 }
-- 
2.34.1

Reply via email to