summaryrefslogtreecommitdiff
path: root/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c')
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c69
1 files changed, 56 insertions, 13 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c
index 75a27ed..57c9383 100644
--- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c
+++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c
@@ -295,6 +295,9 @@ static INT DWC_ETH_QOS_mdio_reset(struct mii_bus *bus)
DBGPR_MDIO("-->DWC_ETH_QOS_mdio_reset: phyaddr : %d\n", pdata->phyaddr);
+ if (pdata->res_data->early_eth_en)
+ return 0;
+
#if 0 /* def DWC_ETH_QOS_CONFIG_PGTEST */
pr_alert("PHY Programming for Autoneg disable\n");
hw_if->read_phy_regs(pdata->phyaddr, MII_BMCR, &phydata);
@@ -458,7 +461,7 @@ static void DWC_ETH_QOS_set_phy_hibernation_mode(struct DWC_ETH_QOS_prv_data *pd
uint mode)
{
u32 phydata = 0;
- EMACINFO("Enter\n");
+ EMACDBG("Enter\n");
DWC_ETH_QOS_mdio_write_direct(pdata, pdata->phyaddr,
DWC_ETH_QOS_PHY_DEBUG_PORT_ADDR_OFFSET,
@@ -467,7 +470,7 @@ static void DWC_ETH_QOS_set_phy_hibernation_mode(struct DWC_ETH_QOS_prv_data *pd
DWC_ETH_QOS_PHY_DEBUG_PORT_DATAPORT,
&phydata);
- EMACINFO("value read 0x%x\n", phydata);
+ EMACDBG("value read 0x%x\n", phydata);
phydata = ((phydata & DWC_ETH_QOS_PHY_HIB_CTRL_PS_HIB_EN_WR_MASK)
| ((DWC_ETH_QOS_PHY_HIB_CTRL_PS_HIB_EN_MASK & mode) << 15));
@@ -482,7 +485,7 @@ static void DWC_ETH_QOS_set_phy_hibernation_mode(struct DWC_ETH_QOS_prv_data *pd
DWC_ETH_QOS_PHY_DEBUG_PORT_DATAPORT,
&phydata);
- EMACINFO("Exit value written 0x%x\n", phydata);
+ EMACDBG("Exit value written 0x%x\n", phydata);
}
/*!
@@ -677,6 +680,7 @@ static void configure_phy_rx_tx_delay(struct DWC_ETH_QOS_prv_data *pdata)
pdata->emac_hw_version_type != EMAC_HW_v2_1_2)
set_phy_rx_tx_delay(pdata, DISABLE_RX_DELAY, DISABLE_TX_DELAY);
}
+ }
break;
}
EMACDBG("Exit\n");
@@ -795,7 +799,6 @@ static inline int DWC_ETH_QOS_configure_io_macro_dll_settings(
EMACDBG("Enter\n");
#ifndef DWC_ETH_QOS_EMULATION_PLATFORM
- if (pdata->emac_hw_version_type == EMAC_HW_v2_0_0 || pdata->emac_hw_version_type == EMAC_HW_v2_3_1)
DWC_ETH_QOS_rgmii_io_macro_dll_reset(pdata);
/* For RGMII ID mode with internal delay*/
@@ -896,6 +899,11 @@ void DWC_ETH_QOS_adjust_link(struct net_device *dev)
if (!phydev)
return;
+ if (pdata->oldlink == -1 && !phydev->link) {
+ pdata->oldlink = phydev->link;
+ return;
+ }
+
DBGPR_MDIO(
"-->DWC_ETH_QOS_adjust_link. address %d link %d\n",
phydev->mdio.addr, phydev->link);
@@ -987,6 +995,13 @@ void DWC_ETH_QOS_adjust_link(struct net_device *dev)
if (new_state) {
phy_print_status(phydev);
+#ifdef CONFIG_MSM_BOOT_TIME_MARKER
+ if ((phydev->link == 1) && !pdata->print_kpi) {
+ place_marker("M - Ethernet is Ready.Link is UP");
+ pdata->print_kpi = 1;
+ }
+#endif
+
if (pdata->ipa_enabled && netif_running(dev)) {
if (phydev->link == 1)
DWC_ETH_QOS_ipa_offload_event_handler(pdata, EV_PHY_LINK_UP);
@@ -994,7 +1009,9 @@ void DWC_ETH_QOS_adjust_link(struct net_device *dev)
DWC_ETH_QOS_ipa_offload_event_handler(pdata, EV_PHY_LINK_DOWN);
}
- if (phydev->link == 0 && pdata->io_macro_phy_intf != RMII_MODE)
+ if (phydev->link == 1)
+ pdata->hw_if.start_mac_tx_rx();
+ else if (phydev->link == 0 && pdata->io_macro_phy_intf != RMII_MODE)
DWC_ETH_QOS_set_clk_and_bus_config(pdata, SPEED_10);
}
@@ -1033,8 +1050,11 @@ static void DWC_ETH_QOS_request_phy_wol(struct DWC_ETH_QOS_prv_data *pdata)
if (!phy_ethtool_set_wol(pdata->phydev, &wol)){
pdata->phy_wol_wolopts = wol.wolopts;
+
+ enable_irq_wake(pdata->phy_irq);
+
device_set_wakeup_enable(&pdata->pdev->dev, 1);
- EMACINFO("Enabled WoL[0x%x] in %s\n", wol.wolopts,
+ EMACDBG("Enabled WoL[0x%x] in %s\n", wol.wolopts,
pdata->phydev->drv->name);
}
}
@@ -1109,20 +1129,27 @@ static int DWC_ETH_QOS_init_phy(struct net_device *dev)
EMACDBG("Phy polling enabled\n");
#endif
- if (pdata->interface == PHY_INTERFACE_MODE_GMII ||
- pdata->interface == PHY_INTERFACE_MODE_RGMII) {
+
+ if (pdata->interface == PHY_INTERFACE_MODE_GMII || pdata->interface == PHY_INTERFACE_MODE_RGMII) {
phy_set_max_speed(phydev, SPEED_1000);
/* Half duplex not supported */
phydev->supported &= ~(SUPPORTED_10baseT_Half | SUPPORTED_100baseT_Half | SUPPORTED_1000baseT_Half);
- } else if ((pdata->interface == PHY_INTERFACE_MODE_MII) ||
- (pdata->interface == PHY_INTERFACE_MODE_RMII)) {
+ } else if ((pdata->interface == PHY_INTERFACE_MODE_MII) || (pdata->interface == PHY_INTERFACE_MODE_RMII)) {
phy_set_max_speed(phydev, SPEED_100);
/* Half duplex is not supported */
phydev->supported &= ~(SUPPORTED_10baseT_Half | SUPPORTED_100baseT_Half);
}
-
phydev->advertising = phydev->supported;
+ if (pdata->res_data->early_eth_en ) {
+ phydev->autoneg = AUTONEG_DISABLE;
+ phydev->speed = SPEED_100;
+ phydev->duplex = DUPLEX_FULL;
+ phydev->advertising = phydev->supported;
+ phydev->advertising &= ~(SUPPORTED_1000baseT_Full);
+ EMACDBG("Set max speed to SPEED_100 as early ethernet enabled\n");
+ }
+
pdata->phydev = phydev;
/* Disable smart speed function for AR8035*/
@@ -1147,7 +1174,7 @@ static int DWC_ETH_QOS_init_phy(struct net_device *dev)
DWC_ETH_QOS_set_phy_hibernation_mode(pdata, 0);
}
- if (pdata->phy_intr_en && pdata->phy_irq) {
+ if (pdata->phy_intr_en) {
INIT_WORK(&pdata->emac_phy_work, DWC_ETH_QOS_defer_phy_isr_work);
init_completion(&pdata->clk_enable_done);
@@ -1163,8 +1190,12 @@ static int DWC_ETH_QOS_init_phy(struct net_device *dev)
phydev->interrupts = PHY_INTERRUPT_ENABLED;
if (phydev->drv->config_intr &&
- !phydev->drv->config_intr(phydev))
+ !phydev->drv->config_intr(phydev)){
DWC_ETH_QOS_request_phy_wol(pdata);
+ } else {
+ EMACERR("Failed to configure PHY interrupts");
+ BUG();
+ }
}
phy_start(pdata->phydev);
@@ -1210,6 +1241,7 @@ int DWC_ETH_QOS_mdio_register(struct net_device *dev)
int ret = Y_SUCCESS;
int phy_reg_read_status, mii_status;
u32 phy_id, phy_id1, phy_id2;
+ u32 phydata = 0;
DBGPR_MDIO("-->DWC_ETH_QOS_mdio_register\n");
@@ -1244,6 +1276,17 @@ int DWC_ETH_QOS_mdio_register(struct net_device *dev)
pdata->phy_intr_en = false;
pdata->always_on_phy = false;
+ if(pdata->res_data->early_eth_en) {
+ EMACDBG("Updated speed to 100 in emac\n");
+ pdata->hw_if.set_mii_speed_100();
+
+ phydata = BMCR_SPEED100;
+ phydata |= BMCR_FULLDPLX;
+ EMACDBG("Updated speed to 100 and autoneg disable\n");
+ pdata->hw_if.write_phy_regs(pdata->phyaddr,
+ MII_BMCR, phydata);
+ }
+
DBGPHY_REGS(pdata);
new_bus = mdiobus_alloc();