Merge "drivers: emac_mdio_fe: Add CL45 indirect read/write API"
This commit is contained in:
commit
6d3c18bad7
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user