aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/synopsys/dwc_eth_qos.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/synopsys/dwc_eth_qos.c')
-rw-r--r--drivers/net/ethernet/synopsys/dwc_eth_qos.c55
1 files changed, 28 insertions, 27 deletions
diff --git a/drivers/net/ethernet/synopsys/dwc_eth_qos.c b/drivers/net/ethernet/synopsys/dwc_eth_qos.c
index 9f159a775af3..4490ebaed127 100644
--- a/drivers/net/ethernet/synopsys/dwc_eth_qos.c
+++ b/drivers/net/ethernet/synopsys/dwc_eth_qos.c
@@ -1246,7 +1246,7 @@ static int dwceqos_mii_init(struct net_local *lp)
1246 lp->mii_bus->read = &dwceqos_mdio_read; 1246 lp->mii_bus->read = &dwceqos_mdio_read;
1247 lp->mii_bus->write = &dwceqos_mdio_write; 1247 lp->mii_bus->write = &dwceqos_mdio_write;
1248 lp->mii_bus->priv = lp; 1248 lp->mii_bus->priv = lp;
1249 lp->mii_bus->parent = &lp->ndev->dev; 1249 lp->mii_bus->parent = &lp->pdev->dev;
1250 1250
1251 of_address_to_resource(lp->pdev->dev.of_node, 0, &res); 1251 of_address_to_resource(lp->pdev->dev.of_node, 0, &res);
1252 snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "%.8llx", 1252 snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "%.8llx",
@@ -1622,13 +1622,7 @@ static void dwceqos_init_hw(struct net_local *lp)
1622 DWCEQOS_MMC_CTRL_RSTONRD); 1622 DWCEQOS_MMC_CTRL_RSTONRD);
1623 dwceqos_enable_mmc_interrupt(lp); 1623 dwceqos_enable_mmc_interrupt(lp);
1624 1624
1625 /* Enable Interrupts */ 1625 dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE, 0);
1626 dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE,
1627 DWCEQOS_DMA_CH0_IE_NIE |
1628 DWCEQOS_DMA_CH0_IE_RIE | DWCEQOS_DMA_CH0_IE_TIE |
1629 DWCEQOS_DMA_CH0_IE_AIE |
1630 DWCEQOS_DMA_CH0_IE_FBEE);
1631
1632 dwceqos_write(lp, REG_DWCEQOS_MAC_IE, 0); 1626 dwceqos_write(lp, REG_DWCEQOS_MAC_IE, 0);
1633 1627
1634 dwceqos_write(lp, REG_DWCEQOS_MAC_CFG, DWCEQOS_MAC_CFG_IPC | 1628 dwceqos_write(lp, REG_DWCEQOS_MAC_CFG, DWCEQOS_MAC_CFG_IPC |
@@ -1905,6 +1899,15 @@ static int dwceqos_open(struct net_device *ndev)
1905 netif_start_queue(ndev); 1899 netif_start_queue(ndev);
1906 tasklet_enable(&lp->tx_bdreclaim_tasklet); 1900 tasklet_enable(&lp->tx_bdreclaim_tasklet);
1907 1901
1902 /* Enable Interrupts -- do this only after we enable NAPI and the
1903 * tasklet.
1904 */
1905 dwceqos_write(lp, REG_DWCEQOS_DMA_CH0_IE,
1906 DWCEQOS_DMA_CH0_IE_NIE |
1907 DWCEQOS_DMA_CH0_IE_RIE | DWCEQOS_DMA_CH0_IE_TIE |
1908 DWCEQOS_DMA_CH0_IE_AIE |
1909 DWCEQOS_DMA_CH0_IE_FBEE);
1910
1908 return 0; 1911 return 0;
1909} 1912}
1910 1913
@@ -2850,25 +2853,17 @@ static int dwceqos_probe(struct platform_device *pdev)
2850 2853
2851 ndev->features = ndev->hw_features; 2854 ndev->features = ndev->hw_features;
2852 2855
2853 netif_napi_add(ndev, &lp->napi, dwceqos_rx_poll, NAPI_POLL_WEIGHT);
2854
2855 ret = register_netdev(ndev);
2856 if (ret) {
2857 dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
2858 goto err_out_clk_dis_aper;
2859 }
2860
2861 lp->phy_ref_clk = devm_clk_get(&pdev->dev, "phy_ref_clk"); 2856 lp->phy_ref_clk = devm_clk_get(&pdev->dev, "phy_ref_clk");
2862 if (IS_ERR(lp->phy_ref_clk)) { 2857 if (IS_ERR(lp->phy_ref_clk)) {
2863 dev_err(&pdev->dev, "phy_ref_clk clock not found.\n"); 2858 dev_err(&pdev->dev, "phy_ref_clk clock not found.\n");
2864 ret = PTR_ERR(lp->phy_ref_clk); 2859 ret = PTR_ERR(lp->phy_ref_clk);
2865 goto err_out_unregister_netdev; 2860 goto err_out_clk_dis_aper;
2866 } 2861 }
2867 2862
2868 ret = clk_prepare_enable(lp->phy_ref_clk); 2863 ret = clk_prepare_enable(lp->phy_ref_clk);
2869 if (ret) { 2864 if (ret) {
2870 dev_err(&pdev->dev, "Unable to enable device clock.\n"); 2865 dev_err(&pdev->dev, "Unable to enable device clock.\n");
2871 goto err_out_unregister_netdev; 2866 goto err_out_clk_dis_aper;
2872 } 2867 }
2873 2868
2874 lp->phy_node = of_parse_phandle(lp->pdev->dev.of_node, 2869 lp->phy_node = of_parse_phandle(lp->pdev->dev.of_node,
@@ -2877,7 +2872,7 @@ static int dwceqos_probe(struct platform_device *pdev)
2877 ret = of_phy_register_fixed_link(lp->pdev->dev.of_node); 2872 ret = of_phy_register_fixed_link(lp->pdev->dev.of_node);
2878 if (ret < 0) { 2873 if (ret < 0) {
2879 dev_err(&pdev->dev, "invalid fixed-link"); 2874 dev_err(&pdev->dev, "invalid fixed-link");
2880 goto err_out_unregister_clk_notifier; 2875 goto err_out_clk_dis_phy;
2881 } 2876 }
2882 2877
2883 lp->phy_node = of_node_get(lp->pdev->dev.of_node); 2878 lp->phy_node = of_node_get(lp->pdev->dev.of_node);
@@ -2886,7 +2881,7 @@ static int dwceqos_probe(struct platform_device *pdev)
2886 ret = of_get_phy_mode(lp->pdev->dev.of_node); 2881 ret = of_get_phy_mode(lp->pdev->dev.of_node);
2887 if (ret < 0) { 2882 if (ret < 0) {
2888 dev_err(&lp->pdev->dev, "error in getting phy i/f\n"); 2883 dev_err(&lp->pdev->dev, "error in getting phy i/f\n");
2889 goto err_out_unregister_clk_notifier; 2884 goto err_out_clk_dis_phy;
2890 } 2885 }
2891 2886
2892 lp->phy_interface = ret; 2887 lp->phy_interface = ret;
@@ -2894,14 +2889,14 @@ static int dwceqos_probe(struct platform_device *pdev)
2894 ret = dwceqos_mii_init(lp); 2889 ret = dwceqos_mii_init(lp);
2895 if (ret) { 2890 if (ret) {
2896 dev_err(&lp->pdev->dev, "error in dwceqos_mii_init\n"); 2891 dev_err(&lp->pdev->dev, "error in dwceqos_mii_init\n");
2897 goto err_out_unregister_clk_notifier; 2892 goto err_out_clk_dis_phy;
2898 } 2893 }
2899 2894
2900 ret = dwceqos_mii_probe(ndev); 2895 ret = dwceqos_mii_probe(ndev);
2901 if (ret != 0) { 2896 if (ret != 0) {
2902 netdev_err(ndev, "mii_probe fail.\n"); 2897 netdev_err(ndev, "mii_probe fail.\n");
2903 ret = -ENXIO; 2898 ret = -ENXIO;
2904 goto err_out_unregister_clk_notifier; 2899 goto err_out_clk_dis_phy;
2905 } 2900 }
2906 2901
2907 dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0); 2902 dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0);
@@ -2919,7 +2914,7 @@ static int dwceqos_probe(struct platform_device *pdev)
2919 if (ret) { 2914 if (ret) {
2920 dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n", 2915 dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n",
2921 ret); 2916 ret);
2922 goto err_out_unregister_clk_notifier; 2917 goto err_out_clk_dis_phy;
2923 } 2918 }
2924 dev_info(&lp->pdev->dev, "pdev->id %d, baseaddr 0x%08lx, irq %d\n", 2919 dev_info(&lp->pdev->dev, "pdev->id %d, baseaddr 0x%08lx, irq %d\n",
2925 pdev->id, ndev->base_addr, ndev->irq); 2920 pdev->id, ndev->base_addr, ndev->irq);
@@ -2929,18 +2924,24 @@ static int dwceqos_probe(struct platform_device *pdev)
2929 if (ret) { 2924 if (ret) {
2930 dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n", 2925 dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n",
2931 ndev->irq, ret); 2926 ndev->irq, ret);
2932 goto err_out_unregister_clk_notifier; 2927 goto err_out_clk_dis_phy;
2933 } 2928 }
2934 2929
2935 if (netif_msg_probe(lp)) 2930 if (netif_msg_probe(lp))
2936 netdev_dbg(ndev, "net_local@%p\n", lp); 2931 netdev_dbg(ndev, "net_local@%p\n", lp);
2937 2932
2933 netif_napi_add(ndev, &lp->napi, dwceqos_rx_poll, NAPI_POLL_WEIGHT);
2934
2935 ret = register_netdev(ndev);
2936 if (ret) {
2937 dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
2938 goto err_out_clk_dis_phy;
2939 }
2940
2938 return 0; 2941 return 0;
2939 2942
2940err_out_unregister_clk_notifier: 2943err_out_clk_dis_phy:
2941 clk_disable_unprepare(lp->phy_ref_clk); 2944 clk_disable_unprepare(lp->phy_ref_clk);
2942err_out_unregister_netdev:
2943 unregister_netdev(ndev);
2944err_out_clk_dis_aper: 2945err_out_clk_dis_aper:
2945 clk_disable_unprepare(lp->apb_pclk); 2946 clk_disable_unprepare(lp->apb_pclk);
2946err_out_free_netdev: 2947err_out_free_netdev: