From f9904e66af1149d97a429f54192826c8fbcb04c5 Mon Sep 17 00:00:00 2001 From: Bhadram Varka Date: Mon, 25 Mar 2019 10:48:04 +0530 Subject: [PATCH] nvethernet: support to read/write PHY reg with mdio-tool Adds IOCTL support to read and write a PHY register Bug 200512251 Change-Id: I43461e7654ca2aa648c978eeaeca12930871006c Signed-off-by: Bhadram Varka Reviewed-on: https://git-master.nvidia.com/r/2080717 GVS: Gerrit_Virtual_Submit Reviewed-by: Narayan Reddy Reviewed-by: Rakesh Goyal Reviewed-by: Srinivas Ramachandran Reviewed-by: Ashutosh Jha Reviewed-by: mobile promotions Tested-by: mobile promotions --- .../ethernet/nvidia/nvethernet/ether_linux.c | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index 10d2b224..d29420a5 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -1077,10 +1077,51 @@ static int ether_start_xmit(struct sk_buff *skb, struct net_device *ndev) return NETDEV_TX_OK; } +/** + * ether_ioctl - network stack IOCTL hook to driver + * @ndev: network device structure + * @rq: Interface request structure used for socket + * @cmd: IOCTL command code + * + * Algorithm: + * 1) Invokes MII API for phy read/write based on IOCTL command + * + * Dependencies: Ethernet interface need to be up. + * + * Protection: None. + * + * Return: 0 - success, negative value - failure. + */ +static int ether_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ + int ret = -EOPNOTSUPP; + + if (!netif_running(dev)) + return -EINVAL; + + switch (cmd) { + case SIOCGMIIPHY: + case SIOCGMIIREG: + case SIOCSMIIREG: + if (!dev->phydev) + return -EINVAL; + + /* generic PHY MII ioctl interface */ + ret = phy_mii_ioctl(dev->phydev, rq, cmd); + break; + + default: + break; + } + + return ret; +} + static const struct net_device_ops ether_netdev_ops = { .ndo_open = ether_open, .ndo_stop = ether_close, .ndo_start_xmit = ether_start_xmit, + .ndo_do_ioctl = ether_ioctl, }; /**