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>
This commit is contained in:
		
					parent
					
						
							
								aded09555b
							
						
					
				
			
			
				commit
				
					
						5445eaf309
					
				
			
		
					 1 changed files with 14 additions and 10 deletions
				
			
		| 
						 | 
					@ -88,6 +88,8 @@
 | 
				
			||||||
#define      MVNETA_TX_IN_PRGRS                  BIT(1)
 | 
					#define      MVNETA_TX_IN_PRGRS                  BIT(1)
 | 
				
			||||||
#define      MVNETA_TX_FIFO_EMPTY                BIT(8)
 | 
					#define      MVNETA_TX_FIFO_EMPTY                BIT(8)
 | 
				
			||||||
#define MVNETA_RX_MIN_FRAME_SIZE                 0x247c
 | 
					#define MVNETA_RX_MIN_FRAME_SIZE                 0x247c
 | 
				
			||||||
 | 
					#define MVNETA_SGMII_SERDES_CFG			 0x24A0
 | 
				
			||||||
 | 
					#define      MVNETA_SGMII_SERDES_PROTO		 0x0cc7
 | 
				
			||||||
#define MVNETA_TYPE_PRIO                         0x24bc
 | 
					#define MVNETA_TYPE_PRIO                         0x24bc
 | 
				
			||||||
#define      MVNETA_FORCE_UNI                    BIT(21)
 | 
					#define      MVNETA_FORCE_UNI                    BIT(21)
 | 
				
			||||||
#define MVNETA_TXQ_CMD_1                         0x24e4
 | 
					#define MVNETA_TXQ_CMD_1                         0x24e4
 | 
				
			||||||
| 
						 | 
					@ -655,6 +657,8 @@ static void mvneta_port_sgmii_config(struct mvneta_port *pp)
 | 
				
			||||||
	val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
 | 
						val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
 | 
				
			||||||
	val |= MVNETA_GMAC2_PSC_ENABLE;
 | 
						val |= MVNETA_GMAC2_PSC_ENABLE;
 | 
				
			||||||
	mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
 | 
						mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Start the Ethernet port RX and TX activity */
 | 
					/* Start the Ethernet port RX and TX activity */
 | 
				
			||||||
| 
						 | 
					@ -2735,11 +2739,17 @@ static int mvneta_probe(struct platform_device *pdev)
 | 
				
			||||||
	pp->clk = devm_clk_get(&pdev->dev, NULL);
 | 
						pp->clk = devm_clk_get(&pdev->dev, NULL);
 | 
				
			||||||
	if (IS_ERR(pp->clk)) {
 | 
						if (IS_ERR(pp->clk)) {
 | 
				
			||||||
		err = PTR_ERR(pp->clk);
 | 
							err = PTR_ERR(pp->clk);
 | 
				
			||||||
		goto err_unmap;
 | 
							goto err_free_irq;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_prepare_enable(pp->clk);
 | 
						clk_prepare_enable(pp->clk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pp->base = of_iomap(dn, 0);
 | 
				
			||||||
 | 
						if (pp->base == NULL) {
 | 
				
			||||||
 | 
							err = -ENOMEM;
 | 
				
			||||||
 | 
							goto err_clk;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dt_mac_addr = of_get_mac_address(dn);
 | 
						dt_mac_addr = of_get_mac_address(dn);
 | 
				
			||||||
	if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) {
 | 
						if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) {
 | 
				
			||||||
		mac_from = "device tree";
 | 
							mac_from = "device tree";
 | 
				
			||||||
| 
						 | 
					@ -2755,12 +2765,6 @@ static int mvneta_probe(struct platform_device *pdev)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pp->base = of_iomap(dn, 0);
 | 
					 | 
				
			||||||
	if (pp->base == NULL) {
 | 
					 | 
				
			||||||
		err = -ENOMEM;
 | 
					 | 
				
			||||||
		goto err_free_irq;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pp->tx_done_timer.data = (unsigned long)dev;
 | 
						pp->tx_done_timer.data = (unsigned long)dev;
 | 
				
			||||||
	pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
 | 
						pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
 | 
				
			||||||
	init_timer(&pp->tx_done_timer);
 | 
						init_timer(&pp->tx_done_timer);
 | 
				
			||||||
| 
						 | 
					@ -2775,7 +2779,7 @@ static int mvneta_probe(struct platform_device *pdev)
 | 
				
			||||||
	err = mvneta_init(pp, phy_addr);
 | 
						err = mvneta_init(pp, phy_addr);
 | 
				
			||||||
	if (err < 0) {
 | 
						if (err < 0) {
 | 
				
			||||||
		dev_err(&pdev->dev, "can't init eth hal\n");
 | 
							dev_err(&pdev->dev, "can't init eth hal\n");
 | 
				
			||||||
		goto err_clk;
 | 
							goto err_unmap;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mvneta_port_power_up(pp, phy_mode);
 | 
						mvneta_port_power_up(pp, phy_mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2805,10 +2809,10 @@ static int mvneta_probe(struct platform_device *pdev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_deinit:
 | 
					err_deinit:
 | 
				
			||||||
	mvneta_deinit(pp);
 | 
						mvneta_deinit(pp);
 | 
				
			||||||
err_clk:
 | 
					 | 
				
			||||||
	clk_disable_unprepare(pp->clk);
 | 
					 | 
				
			||||||
err_unmap:
 | 
					err_unmap:
 | 
				
			||||||
	iounmap(pp->base);
 | 
						iounmap(pp->base);
 | 
				
			||||||
 | 
					err_clk:
 | 
				
			||||||
 | 
						clk_disable_unprepare(pp->clk);
 | 
				
			||||||
err_free_irq:
 | 
					err_free_irq:
 | 
				
			||||||
	irq_dispose_mapping(dev->irq);
 | 
						irq_dispose_mapping(dev->irq);
 | 
				
			||||||
err_free_netdev:
 | 
					err_free_netdev:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue