From 48e0d60b070b4afa9d4cd3d4e7e83ab374bb45b4 Mon Sep 17 00:00:00 2001 From: Narayan Reddy Date: Fri, 30 Jul 2021 14:21:38 +0530 Subject: [PATCH] nvethernet: PHY register read/write for fixed-link case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ethernet@
{ nvidia,mdio_address = ; fixed-link { speed = <1000>; full-duplex; }; }; 1. Added nvidia DT property (nvidia,mdio_address) for passing the PHY MDIO bus address. 2. If this property present in DT then driver calls PHY MDIO read/write functions directly instead of going through PHY subsystem. 3. If this property is not present – then driver PHY mdio read/write goes through PHY subsystem. Bug 200733774 Change-Id: Ib3a533bd73910f5c95ed0884be28820adf729726 Signed-off-by: Narayan Reddy Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2567762 Tested-by: Bitan Biswas Tested-by: mobile promotions Reviewed-by: svc_kernel_abi Reviewed-by: Srinivas Ramachandran Reviewed-by: mobile promotions GVS: Gerrit_Virtual_Submit --- .../ethernet/nvidia/nvethernet/ether_linux.c | 43 ++++++++++++++++--- .../ethernet/nvidia/nvethernet/ether_linux.h | 8 ++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index 1b7514ca..a0e1c7d1 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -3501,6 +3501,7 @@ static int ether_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { int ret = -EOPNOTSUPP; struct ether_priv_data *pdata = netdev_priv(dev); + struct mii_ioctl_data *mii_data = if_mii(rq); if (!dev || !rq) { dev_err(pdata->dev, "%s: Invalid arg\n", __func__); @@ -3514,14 +3515,37 @@ static int ether_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) switch (cmd) { case SIOCGMIIPHY: - case SIOCGMIIREG: - case SIOCSMIIREG: - if (!dev->phydev) { - return -EINVAL; + if (pdata->mdio_addr != FIXED_PHY_INVALID_MDIO_ADDR) { + mii_data->phy_id = pdata->mdio_addr; + ret = 0; + } else { + if (!dev->phydev) { + return -EINVAL; + } + ret = phy_mii_ioctl(dev->phydev, rq, cmd); } + break; - /* generic PHY MII ioctl interface */ - ret = phy_mii_ioctl(dev->phydev, rq, cmd); + case SIOCGMIIREG: + if (pdata->mdio_addr != FIXED_PHY_INVALID_MDIO_ADDR) { + ret = ether_handle_priv_rmdio_ioctl(pdata, rq); + } else { + if (!dev->phydev) { + return -EINVAL; + } + ret = phy_mii_ioctl(dev->phydev, rq, cmd); + } + break; + + case SIOCSMIIREG: + if (pdata->mdio_addr != FIXED_PHY_INVALID_MDIO_ADDR) { + ret = ether_handle_priv_wmdio_ioctl(pdata, rq); + } else { + if (!dev->phydev) { + return -EINVAL; + } + ret = phy_mii_ioctl(dev->phydev, rq, cmd); + } break; case SIOCDEVPRIVATE: @@ -5221,6 +5245,13 @@ static int ether_parse_dt(struct ether_priv_data *pdata) unsigned int i, mtlq, chan, bitmap; unsigned int dt_pad_calibration_enable; + /* Read MDIO address */ + ret = of_property_read_u32(np, "nvidia,mdio_addr", + &pdata->mdio_addr); + if (ret != 0) { + dev_info(dev, "failed to read MDIO address\n"); + pdata->mdio_addr = FIXED_PHY_INVALID_MDIO_ADDR; + } /* read ptp clock */ ret = of_property_read_u32(np, "nvidia,ptp_ref_clock_speed", &pdata->ptp_ref_clock_speed); diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index a7fe4f39..0e4f8829 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -215,6 +215,12 @@ #define NVGRO_PURGE_TIMER_RUNNING OSI_BIT(1) #endif +/** + * @brief Invalid MDIO address for fixed link + */ +#define FIXED_PHY_INVALID_MDIO_ADDR 0xFFU + + /** * @brief Check if Tx data buffer length is within bounds. * @@ -559,6 +565,8 @@ struct ether_priv_data { /** NVGRO packet dropped count */ u64 nvgro_dropped; #endif + /** Platform MDIO address */ + unsigned int mdio_addr; }; /**