diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index 04bdb442..1a2ab86b 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -49,6 +49,7 @@ static void ether_disable_clks(struct ether_priv_data *pdata) if (!IS_ERR_OR_NULL(pdata->pllrefe_clk)) { clk_disable_unprepare(pdata->pllrefe_clk); } + pdata->clks_enable = false; } /** @@ -107,6 +108,8 @@ static int ether_enable_clks(struct ether_priv_data *pdata) } } + pdata->clks_enable = true; + return 0; err_tx: @@ -2279,6 +2282,12 @@ static int ether_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg, struct net_device *ndev = bus->priv; struct ether_priv_data *pdata = netdev_priv(ndev); + if (!pdata->clks_enable) { + dev_err(pdata->dev, + "%s:No clks available, skipping PHY write\n", __func__); + return -ENODEV; + } + return osi_write_phy_reg(pdata->osi_core, (unsigned int)phyaddr, (unsigned int)phyreg, phydata); } @@ -2303,6 +2312,12 @@ static int ether_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg) struct net_device *ndev = bus->priv; struct ether_priv_data *pdata = netdev_priv(ndev); + if (!pdata->clks_enable) { + dev_err(pdata->dev, + "%s:No clks available, skipping PHY read\n", __func__); + return -ENODEV; + } + return osi_read_phy_reg(pdata->osi_core, (unsigned int)phyaddr, (unsigned int)phyreg); } diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index 9c34e528..0d8cdabb 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -298,6 +298,8 @@ struct ether_priv_data { unsigned int max_platform_mtu; /** Spin lock for PTP registers */ raw_spinlock_t ptp_lock; + /** Clocks enable check */ + bool clks_enable; }; /**