aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuan Nguyen <qnguyen@apm.com>2017-08-29 18:43:12 -0400
committerDavid S. Miller <davem@davemloft.net>2017-08-29 19:13:08 -0400
commit183db481279437590f75a8a0479d512e5dd597de (patch)
tree8deb8f4c1b199361c6d0fa519771cbc1767ec816
parente7562597b46d099a78d45c781ee8d1a7a93c53f1 (diff)
drivers: net: xgene: Correct probe sequence handling
The phy is connected at early stage of probe but not properly disconnected if error occurs. This patch fixes the issue. Also changing the return type of xgene_enet_check_phy_handle(), since this function always returns success. Signed-off-by: Quan Nguyen <qnguyen@apm.com> Signed-off-by: Iyappan Subramanian <isubramanian@apm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
index 1d307f2def2d..6e253d913fe2 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -1661,21 +1661,21 @@ static int xgene_enet_get_irqs(struct xgene_enet_pdata *pdata)
1661 return 0; 1661 return 0;
1662} 1662}
1663 1663
1664static int xgene_enet_check_phy_handle(struct xgene_enet_pdata *pdata) 1664static void xgene_enet_check_phy_handle(struct xgene_enet_pdata *pdata)
1665{ 1665{
1666 int ret; 1666 int ret;
1667 1667
1668 if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) 1668 if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII)
1669 return 0; 1669 return;
1670 1670
1671 if (!IS_ENABLED(CONFIG_MDIO_XGENE)) 1671 if (!IS_ENABLED(CONFIG_MDIO_XGENE))
1672 return 0; 1672 return;
1673 1673
1674 ret = xgene_enet_phy_connect(pdata->ndev); 1674 ret = xgene_enet_phy_connect(pdata->ndev);
1675 if (!ret) 1675 if (!ret)
1676 pdata->mdio_driver = true; 1676 pdata->mdio_driver = true;
1677 1677
1678 return 0; 1678 return;
1679} 1679}
1680 1680
1681static void xgene_enet_gpiod_get(struct xgene_enet_pdata *pdata) 1681static void xgene_enet_gpiod_get(struct xgene_enet_pdata *pdata)
@@ -1779,10 +1779,6 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
1779 if (ret) 1779 if (ret)
1780 return ret; 1780 return ret;
1781 1781
1782 ret = xgene_enet_check_phy_handle(pdata);
1783 if (ret)
1784 return ret;
1785
1786 xgene_enet_gpiod_get(pdata); 1782 xgene_enet_gpiod_get(pdata);
1787 1783
1788 pdata->clk = devm_clk_get(&pdev->dev, NULL); 1784 pdata->clk = devm_clk_get(&pdev->dev, NULL);
@@ -2097,9 +2093,11 @@ static int xgene_enet_probe(struct platform_device *pdev)
2097 goto err; 2093 goto err;
2098 } 2094 }
2099 2095
2096 xgene_enet_check_phy_handle(pdata);
2097
2100 ret = xgene_enet_init_hw(pdata); 2098 ret = xgene_enet_init_hw(pdata);
2101 if (ret) 2099 if (ret)
2102 goto err; 2100 goto err2;
2103 2101
2104 link_state = pdata->mac_ops->link_state; 2102 link_state = pdata->mac_ops->link_state;
2105 if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { 2103 if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) {
@@ -2117,29 +2115,30 @@ static int xgene_enet_probe(struct platform_device *pdev)
2117 spin_lock_init(&pdata->stats_lock); 2115 spin_lock_init(&pdata->stats_lock);
2118 ret = xgene_extd_stats_init(pdata); 2116 ret = xgene_extd_stats_init(pdata);
2119 if (ret) 2117 if (ret)
2120 goto err2; 2118 goto err1;
2121 2119
2122 xgene_enet_napi_add(pdata); 2120 xgene_enet_napi_add(pdata);
2123 ret = register_netdev(ndev); 2121 ret = register_netdev(ndev);
2124 if (ret) { 2122 if (ret) {
2125 netdev_err(ndev, "Failed to register netdev\n"); 2123 netdev_err(ndev, "Failed to register netdev\n");
2126 goto err2; 2124 goto err1;
2127 } 2125 }
2128 2126
2129 return 0; 2127 return 0;
2130 2128
2131err2: 2129err1:
2132 /* 2130 /*
2133 * If necessary, free_netdev() will call netif_napi_del() and undo 2131 * If necessary, free_netdev() will call netif_napi_del() and undo
2134 * the effects of xgene_enet_napi_add()'s calls to netif_napi_add(). 2132 * the effects of xgene_enet_napi_add()'s calls to netif_napi_add().
2135 */ 2133 */
2136 2134
2135 xgene_enet_delete_desc_rings(pdata);
2136
2137err2:
2137 if (pdata->mdio_driver) 2138 if (pdata->mdio_driver)
2138 xgene_enet_phy_disconnect(pdata); 2139 xgene_enet_phy_disconnect(pdata);
2139 else if (phy_interface_mode_is_rgmii(pdata->phy_mode)) 2140 else if (phy_interface_mode_is_rgmii(pdata->phy_mode))
2140 xgene_enet_mdio_remove(pdata); 2141 xgene_enet_mdio_remove(pdata);
2141err1:
2142 xgene_enet_delete_desc_rings(pdata);
2143err: 2142err:
2144 free_netdev(ndev); 2143 free_netdev(ndev);
2145 return ret; 2144 return ret;