diff options
Diffstat (limited to 'drivers/net/ethernet/marvell/mvneta.c')
| -rw-r--r-- | drivers/net/ethernet/marvell/mvneta.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 712779fb12b7..b017818bccae 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
| @@ -88,6 +88,8 @@ | |||
| 88 | #define MVNETA_TX_IN_PRGRS BIT(1) | 88 | #define MVNETA_TX_IN_PRGRS BIT(1) |
| 89 | #define MVNETA_TX_FIFO_EMPTY BIT(8) | 89 | #define MVNETA_TX_FIFO_EMPTY BIT(8) |
| 90 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c | 90 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c |
| 91 | #define MVNETA_SGMII_SERDES_CFG 0x24A0 | ||
| 92 | #define MVNETA_SGMII_SERDES_PROTO 0x0cc7 | ||
| 91 | #define MVNETA_TYPE_PRIO 0x24bc | 93 | #define MVNETA_TYPE_PRIO 0x24bc |
| 92 | #define MVNETA_FORCE_UNI BIT(21) | 94 | #define MVNETA_FORCE_UNI BIT(21) |
| 93 | #define MVNETA_TXQ_CMD_1 0x24e4 | 95 | #define MVNETA_TXQ_CMD_1 0x24e4 |
| @@ -655,6 +657,8 @@ static void mvneta_port_sgmii_config(struct mvneta_port *pp) | |||
| 655 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | 657 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); |
| 656 | val |= MVNETA_GMAC2_PSC_ENABLE; | 658 | val |= MVNETA_GMAC2_PSC_ENABLE; |
| 657 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | 659 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); |
| 660 | |||
| 661 | mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO); | ||
| 658 | } | 662 | } |
| 659 | 663 | ||
| 660 | /* Start the Ethernet port RX and TX activity */ | 664 | /* Start the Ethernet port RX and TX activity */ |
| @@ -2728,28 +2732,24 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2728 | 2732 | ||
| 2729 | pp = netdev_priv(dev); | 2733 | pp = netdev_priv(dev); |
| 2730 | 2734 | ||
| 2731 | pp->tx_done_timer.function = mvneta_tx_done_timer_callback; | ||
| 2732 | init_timer(&pp->tx_done_timer); | ||
| 2733 | clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags); | ||
| 2734 | |||
| 2735 | pp->weight = MVNETA_RX_POLL_WEIGHT; | 2735 | pp->weight = MVNETA_RX_POLL_WEIGHT; |
| 2736 | pp->phy_node = phy_node; | 2736 | pp->phy_node = phy_node; |
| 2737 | pp->phy_interface = phy_mode; | 2737 | pp->phy_interface = phy_mode; |
| 2738 | 2738 | ||
| 2739 | pp->base = of_iomap(dn, 0); | ||
| 2740 | if (pp->base == NULL) { | ||
| 2741 | err = -ENOMEM; | ||
| 2742 | goto err_free_irq; | ||
| 2743 | } | ||
| 2744 | |||
| 2745 | pp->clk = devm_clk_get(&pdev->dev, NULL); | 2739 | pp->clk = devm_clk_get(&pdev->dev, NULL); |
| 2746 | if (IS_ERR(pp->clk)) { | 2740 | if (IS_ERR(pp->clk)) { |
| 2747 | err = PTR_ERR(pp->clk); | 2741 | err = PTR_ERR(pp->clk); |
| 2748 | goto err_unmap; | 2742 | goto err_free_irq; |
| 2749 | } | 2743 | } |
| 2750 | 2744 | ||
| 2751 | clk_prepare_enable(pp->clk); | 2745 | clk_prepare_enable(pp->clk); |
| 2752 | 2746 | ||
| 2747 | pp->base = of_iomap(dn, 0); | ||
| 2748 | if (pp->base == NULL) { | ||
| 2749 | err = -ENOMEM; | ||
| 2750 | goto err_clk; | ||
| 2751 | } | ||
| 2752 | |||
| 2753 | dt_mac_addr = of_get_mac_address(dn); | 2753 | dt_mac_addr = of_get_mac_address(dn); |
| 2754 | if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) { | 2754 | if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) { |
| 2755 | mac_from = "device tree"; | 2755 | mac_from = "device tree"; |
| @@ -2766,6 +2766,9 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2766 | } | 2766 | } |
| 2767 | 2767 | ||
| 2768 | pp->tx_done_timer.data = (unsigned long)dev; | 2768 | pp->tx_done_timer.data = (unsigned long)dev; |
| 2769 | pp->tx_done_timer.function = mvneta_tx_done_timer_callback; | ||
| 2770 | init_timer(&pp->tx_done_timer); | ||
| 2771 | clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags); | ||
| 2769 | 2772 | ||
| 2770 | pp->tx_ring_size = MVNETA_MAX_TXD; | 2773 | pp->tx_ring_size = MVNETA_MAX_TXD; |
| 2771 | pp->rx_ring_size = MVNETA_MAX_RXD; | 2774 | pp->rx_ring_size = MVNETA_MAX_RXD; |
| @@ -2776,7 +2779,7 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2776 | err = mvneta_init(pp, phy_addr); | 2779 | err = mvneta_init(pp, phy_addr); |
| 2777 | if (err < 0) { | 2780 | if (err < 0) { |
| 2778 | dev_err(&pdev->dev, "can't init eth hal\n"); | 2781 | dev_err(&pdev->dev, "can't init eth hal\n"); |
| 2779 | goto err_clk; | 2782 | goto err_unmap; |
| 2780 | } | 2783 | } |
| 2781 | mvneta_port_power_up(pp, phy_mode); | 2784 | mvneta_port_power_up(pp, phy_mode); |
| 2782 | 2785 | ||
| @@ -2806,10 +2809,10 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2806 | 2809 | ||
| 2807 | err_deinit: | 2810 | err_deinit: |
| 2808 | mvneta_deinit(pp); | 2811 | mvneta_deinit(pp); |
| 2809 | err_clk: | ||
| 2810 | clk_disable_unprepare(pp->clk); | ||
| 2811 | err_unmap: | 2812 | err_unmap: |
| 2812 | iounmap(pp->base); | 2813 | iounmap(pp->base); |
| 2814 | err_clk: | ||
| 2815 | clk_disable_unprepare(pp->clk); | ||
| 2813 | err_free_irq: | 2816 | err_free_irq: |
| 2814 | irq_dispose_mapping(dev->irq); | 2817 | irq_dispose_mapping(dev->irq); |
| 2815 | err_free_netdev: | 2818 | err_free_netdev: |
