aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorArnaud Patard \(Rtp\) <arnaud.patard@rtp-net.org>2013-07-29 15:56:48 -0400
committerDavid S. Miller <davem@davemloft.net>2013-07-30 22:32:36 -0400
commit5445eaf309ff2868c77354016505fc7315947a35 (patch)
treee781a2e6b62715e3ff0e125182681f7be0b946fc /drivers/net/ethernet
parentaded09555b7a0748a692d0d644ac54c10c1c0757 (diff)
mvneta: Try to fix mvneta when compiled as module
When the mvneta driver is compiled as module, the clock is disabled before it's loading. This will reset the registers values and all configuration made by the bootloader. This patch sets the "sgmii serdes configuration" register to a magical value found in: https://github.com/yellowback/ubuntu-precise-armadaxp/blob/master/arch/arm/mach-armadaxp/armada_xp_family/ctrlEnv/mvCtrlEnvLib.c With this change, the interrupts are working/generated and ethernet is working. Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/marvell/mvneta.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 3ac29c64bd6c..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 */
@@ -2735,11 +2739,17 @@ static int mvneta_probe(struct platform_device *pdev)
2735 pp->clk = devm_clk_get(&pdev->dev, NULL); 2739 pp->clk = devm_clk_get(&pdev->dev, NULL);
2736 if (IS_ERR(pp->clk)) { 2740 if (IS_ERR(pp->clk)) {
2737 err = PTR_ERR(pp->clk); 2741 err = PTR_ERR(pp->clk);
2738 goto err_unmap; 2742 goto err_free_irq;
2739 } 2743 }
2740 2744
2741 clk_prepare_enable(pp->clk); 2745 clk_prepare_enable(pp->clk);
2742 2746
2747 pp->base = of_iomap(dn, 0);
2748 if (pp->base == NULL) {
2749 err = -ENOMEM;
2750 goto err_clk;
2751 }
2752
2743 dt_mac_addr = of_get_mac_address(dn); 2753 dt_mac_addr = of_get_mac_address(dn);
2744 if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) { 2754 if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) {
2745 mac_from = "device tree"; 2755 mac_from = "device tree";
@@ -2755,12 +2765,6 @@ static int mvneta_probe(struct platform_device *pdev)
2755 } 2765 }
2756 } 2766 }
2757 2767
2758 pp->base = of_iomap(dn, 0);
2759 if (pp->base == NULL) {
2760 err = -ENOMEM;
2761 goto err_free_irq;
2762 }
2763
2764 pp->tx_done_timer.data = (unsigned long)dev; 2768 pp->tx_done_timer.data = (unsigned long)dev;
2765 pp->tx_done_timer.function = mvneta_tx_done_timer_callback; 2769 pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
2766 init_timer(&pp->tx_done_timer); 2770 init_timer(&pp->tx_done_timer);
@@ -2775,7 +2779,7 @@ static int mvneta_probe(struct platform_device *pdev)
2775 err = mvneta_init(pp, phy_addr); 2779 err = mvneta_init(pp, phy_addr);
2776 if (err < 0) { 2780 if (err < 0) {
2777 dev_err(&pdev->dev, "can't init eth hal\n"); 2781 dev_err(&pdev->dev, "can't init eth hal\n");
2778 goto err_clk; 2782 goto err_unmap;
2779 } 2783 }
2780 mvneta_port_power_up(pp, phy_mode); 2784 mvneta_port_power_up(pp, phy_mode);
2781 2785
@@ -2805,10 +2809,10 @@ static int mvneta_probe(struct platform_device *pdev)
2805 2809
2806err_deinit: 2810err_deinit:
2807 mvneta_deinit(pp); 2811 mvneta_deinit(pp);
2808err_clk:
2809 clk_disable_unprepare(pp->clk);
2810err_unmap: 2812err_unmap:
2811 iounmap(pp->base); 2813 iounmap(pp->base);
2814err_clk:
2815 clk_disable_unprepare(pp->clk);
2812err_free_irq: 2816err_free_irq:
2813 irq_dispose_mapping(dev->irq); 2817 irq_dispose_mapping(dev->irq);
2814err_free_netdev: 2818err_free_netdev: