Merge "drivers: emac_mdio_fe: Add CL45 indirect read/write API"

This commit is contained in:
QCTECMDR Service 2024-08-26 00:16:17 -07:00 committed by Gerrit - the friendly Code Review server
commit 6d3c18bad7
2 changed files with 86 additions and 0 deletions

View File

@ -454,6 +454,73 @@ int virtio_mdio_write_c45(struct mii_bus *bus, int addr, int devnum, int regnum,
}
EXPORT_SYMBOL_GPL(virtio_mdio_write_c45);
int virtio_mdio_read_c45_indirect(struct mii_bus *bus, int addr, int regnum)
{
struct phy_remote_access_t *phy_request = NULL;
unsigned long tmp;
mutex_lock(&emac_mdio_fe_pdev->emac_mdio_fe_lock);
phy_request = &emac_mdio_fe_ctx->tx_msg.request_data;
memset(phy_request, 0, sizeof(*phy_request));
phy_request->mdio_type = MDIO_CLAUSE_45_DIRECT;
phy_request->mdio_op_remote_type = MDIO_REMOTE_OP_TYPE_READ;
phy_request->phyaddr = addr;
phy_request->phydev = mdiobus_c45_devad(regnum);
phy_request->phyreg = mdiobus_c45_regad(regnum);
emac_mdio_fe_ctx->tx_msg.type = VIRTIO_EMAC_MDIO_FE_REQ;
emac_mdio_fe_ctx->tx_msg.len = sizeof(struct fe_to_be_msg);
emac_mdio_fe_xmit(emac_mdio_fe_ctx);
EMAC_MDIO_FE_DBG("Sent VIRTIO_EMAC_MDIO_FE_REQ Event Cmd\n");
emac_mdio_fe_ctx->phy_reply = -1;
tmp = msecs_to_jiffies(WAIT_PHY_REPLY_MAX_TIMEOUT);
if (down_timeout(&emac_mdio_fe_ctx->emac_mdio_fe_sem, tmp) == -ETIME) {
EMAC_MDIO_FE_WARN("Wait for phy reply timeout\n");
mutex_unlock(&emac_mdio_fe_pdev->emac_mdio_fe_lock);
return -1;
}
mutex_unlock(&emac_mdio_fe_pdev->emac_mdio_fe_lock);
return (int)emac_mdio_fe_ctx->phy_reply;
}
EXPORT_SYMBOL_GPL(virtio_mdio_read_c45_indirect);
int virtio_mdio_write_c45_indirect(struct mii_bus *bus, int addr, int regnum, u16 val)
{
struct phy_remote_access_t *phy_request = NULL;
unsigned long tmp;
mutex_lock(&emac_mdio_fe_pdev->emac_mdio_fe_lock);
phy_request = &emac_mdio_fe_ctx->tx_msg.request_data;
memset(phy_request, 0, sizeof(*phy_request));
phy_request->mdio_type = MDIO_CLAUSE_45_DIRECT;
phy_request->mdio_op_remote_type = MDIO_REMOTE_OP_TYPE_WRITE;
phy_request->phyaddr = addr;
phy_request->phydev = mdiobus_c45_devad(regnum);
phy_request->phyreg = mdiobus_c45_regad(regnum);
phy_request->phydata = val;
emac_mdio_fe_ctx->tx_msg.type = VIRTIO_EMAC_MDIO_FE_REQ;
emac_mdio_fe_ctx->tx_msg.len = sizeof(struct fe_to_be_msg);
emac_mdio_fe_xmit(emac_mdio_fe_ctx);
EMAC_MDIO_FE_DBG("Sent VIRTIO_EMAC_MDIO_FE_REQ Event Cmd\n");
emac_mdio_fe_ctx->phy_reply = -1;
tmp = msecs_to_jiffies(WAIT_PHY_REPLY_MAX_TIMEOUT);
if (down_timeout(&emac_mdio_fe_ctx->emac_mdio_fe_sem, tmp) == -ETIME) {
EMAC_MDIO_FE_WARN("Wait for phy reply timeout\n");
mutex_unlock(&emac_mdio_fe_pdev->emac_mdio_fe_lock);
return -1;
}
mutex_unlock(&emac_mdio_fe_pdev->emac_mdio_fe_lock);
return (int)emac_mdio_fe_ctx->phy_reply;
}
EXPORT_SYMBOL_GPL(virtio_mdio_write_c45_indirect);
static int emac_mdio_fe_probe(struct virtio_device *vdev)
{
int ret;

View File

@ -17,6 +17,10 @@ int virtio_mdio_read_c45(struct mii_bus *bus, int addr, int devnum, int regnum);
int virtio_mdio_write_c45(struct mii_bus *bus, int addr, int devnum, int regnum, u16 val);
int virtio_mdio_read_c45_indirect(struct mii_bus *bus, int addr, int regnum);
int virtio_mdio_write_c45_indirect(struct mii_bus *bus, int addr, int regnum, u16 val);
#else
static inline int virtio_mdio_read(struct mii_bus *bus, int addr, int regnum)
{
@ -39,6 +43,21 @@ static inline int virtio_mdio_read_c45(struct mii_bus *bus, int addr, int devnum
static inline int virtio_mdio_write_c45(struct mii_bus *bus,
int addr, int devnum,
int regnum, u16 val)
{
/* Not enabled */
return 0;
}
static inline int virtio_mdio_read_c45_indirect(struct mii_bus *bus, int addr,
int regnum)
{
/* Not enabled */
return 0;
}
static inline int virtio_mdio_write_c45_indirect(struct mii_bus *bus, int addr,
int regnum, u16 val)
{
/* Not enabled */
return 0;