if (!is_valid_ether_addr(dev->dev_addr))
return -EADDRNOTAVAIL;
+ /* Reset the PHY */
+ gpio_set_value(pdata->phy_reset_gpio, 0);
+ usleep_range(10, 11);
+ gpio_set_value(pdata->phy_reset_gpio, 1);
+
+ /* PHY initialisation */
+ ret = eqos_init_phy(dev);
+ if (ret) {
+ dev_err(&dev->dev, "%s: Cannot attach to PHY (error: %d)\n", __func__, ret);
+ return ret;
+ }
+
ret = request_txrx_irqs(pdata);
if (ret != Y_SUCCESS)
goto err_irq_0;
pr_debug("-->%s\n", __func__);
+ /* Put PHY in low power mode */
+ if (pdata->phydev && pdata->phydev->drv &&
+ pdata->phydev->drv->low_power_mode)
+ pdata->phydev->drv->low_power_mode(pdata->phydev, true);
+
+ /* Stop and disconnect the PHY */
+ if (pdata->phydev) {
+ phy_stop(pdata->phydev);
+ phy_disconnect(pdata->phydev);
+ gpio_set_value(pdata->phy_reset_gpio, 0);
+ pdata->phydev = NULL;
+ }
+
mutex_lock(&pdata->hw_change_lock);
eqos_stop_dev(pdata);
/* Unregister broadcasting MAC timestamp to clients */
tegra_unregister_hwtime_source();
#endif
-
- if (pdata->phydev && pdata->phydev->drv &&
- pdata->phydev->drv->low_power_mode) {
- pdata->phydev->drv->low_power_mode(pdata->phydev, true);
- if (!pdata->suspended)
- phy_stop_interrupts(pdata->phydev);
- } else if (pdata->phydev) {
- /* stop the PHY */
- phy_stop(pdata->phydev);
- gpio_set_value(pdata->phy_reset_gpio, 0);
- }
-
/* Stop the PHY state machine */
if (pdata->phydev)
phy_stop_machine(pdata->phydev);
pr_debug("-->%s()\n", __func__);
- if (pdata->phydev->drv->low_power_mode) {
- /* reset the PHY Broadcom PHY needs minimum of 2us delay */
- pr_debug("%s(): exit from iddq-lp mode\n", __func__);
- gpio_set_value(pdata->phy_reset_gpio, 0);
- usleep_range(10, 11);
- gpio_set_value(pdata->phy_reset_gpio, 1);
- pdata->phydev->drv->low_power_mode(pdata->phydev, false);
- if (pdata->suspended == 0 && netif_running(pdata->dev))
- phy_start_interrupts(pdata->phydev);
- } else if (!gpio_get_value(pdata->phy_reset_gpio))
- {
- /* deassert phy reset */
- gpio_set_value(pdata->phy_reset_gpio, 1);
- }
-
/* issue CAR reset to device */
hw_if->car_reset(pdata);
hw_if->pad_calibrate(pdata);
pr_err("%s: MDIO is not present\n\n", DEV_NAME);
}
- if (pdata->phydev->drv->low_power_mode) {
- pdata->phydev->drv->low_power_mode(pdata->phydev, true);
- phy_stop_interrupts(pdata->phydev);
- }
-
/* enabling and registration of irq with magic wakeup */
if (1 == pdata->hw_feat.mgk_sel) {
device_set_wakeup_capable(&pdev->dev, 1);
pdata->suspended = 1;
if (netif_running(dev)) {
- /* Disable PHY interrupts */
- phy_stop_interrupts(pdata->phydev);
+ if (pdata->phydev && pdata->phydev->drv &&
+ pdata->phydev->drv->low_power_mode)
+ pdata->phydev->drv->low_power_mode(pdata->phydev, true);
+
+ /* Stop and disconnect the PHY */
+ if (pdata->phydev) {
+ phy_stop_interrupts(pdata->phydev);
+ phy_stop(pdata->phydev);
+ gpio_set_value(pdata->phy_reset_gpio, 0);
+ }
+
eqos_stop_dev(pdata);
pdata->hw_stopped = true;
}
eqos_clock_init(pdata);
if (netif_running(dev)) {
+ if (pdata->phydev->drv->low_power_mode) {
+ /* reset the PHY Broadcom PHY needs minimum of 2us delay */
+ pr_err("%s(): exit from iddq-lp mode\n", __func__);
+ gpio_set_value(pdata->phy_reset_gpio, 0);
+ usleep_range(10, 11);
+ gpio_set_value(pdata->phy_reset_gpio, 1);
+ pdata->phydev->drv->low_power_mode(pdata->phydev, false);
+ } else if (!gpio_get_value(pdata->phy_reset_gpio)) {
+ /* deassert phy reset */
+ gpio_set_value(pdata->phy_reset_gpio, 1);
+ }
/* first start eqos */
eqos_start_dev(pdata);
* \retval 0 on success & negative number on failure.
*/
-static int eqos_init_phy(struct net_device *dev)
+int eqos_init_phy(struct net_device *dev)
{
struct eqos_prv_data *pdata = netdev_priv(dev);
struct phy_device *phydev = NULL;
}
pdata->mii = new_bus;
- ret = eqos_init_phy(dev);
- if (unlikely(ret)) {
- pr_err("Cannot attach to PHY (error: %d)\n", ret);
- goto err_out_phy_connect;
- }
-
DBGPR_MDIO("<--eqos_mdio_register\n");
return ret;
-
- err_out_phy_connect:
- eqos_mdio_unregister(dev);
- return ret;
}
/*!