mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 287b9df160b6159f8d385424904f8bac501280c1 Mon Sep 17 00:00:00 2001
 | |
| From: Russell King <rmk+kernel@armlinux.org.uk>
 | |
| Date: Sat, 9 Jul 2016 10:58:16 +0100
 | |
| Subject: pci: mvebu: time out reset on link up
 | |
| 
 | |
| If the port reports that the link is up while we are resetting, there's
 | |
| little point in waiting for the full duration.
 | |
| 
 | |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
 | |
| ---
 | |
|  drivers/pci/controller/pci-mvebu.c | 20 ++++++++++++++------
 | |
|  1 file changed, 14 insertions(+), 6 deletions(-)
 | |
| 
 | |
| --- a/drivers/pci/controller/pci-mvebu.c
 | |
| +++ b/drivers/pci/controller/pci-mvebu.c
 | |
| @@ -1414,6 +1414,7 @@ static int mvebu_pcie_powerup(struct mve
 | |
|  
 | |
|  	if (port->reset_gpio) {
 | |
|  		u32 reset_udelay = PCI_PM_D3COLD_WAIT * 1000;
 | |
| +		unsigned int i;
 | |
|  
 | |
|  		of_property_read_u32(port->dn, "reset-delay-us",
 | |
|  				     &reset_udelay);
 | |
| @@ -1421,7 +1422,13 @@ static int mvebu_pcie_powerup(struct mve
 | |
|  		udelay(100);
 | |
|  
 | |
|  		gpiod_set_value_cansleep(port->reset_gpio, 0);
 | |
| -		msleep(reset_udelay / 1000);
 | |
| +		for (i = 0; i < reset_udelay; i += 1000) {
 | |
| +			if (mvebu_pcie_link_up(port))
 | |
| +				break;
 | |
| +			msleep(1);
 | |
| +		}
 | |
| +
 | |
| +		printk("%s: reset completed in %dus\n", port->name, i);
 | |
|  	}
 | |
|  
 | |
|  	return 0;
 | |
| @@ -1538,15 +1545,16 @@ static int mvebu_pcie_probe(struct platf
 | |
|  		if (!child)
 | |
|  			continue;
 | |
|  
 | |
| -		ret = mvebu_pcie_powerup(port);
 | |
| -		if (ret < 0)
 | |
| -			continue;
 | |
| -
 | |
|  		port->base = mvebu_pcie_map_registers(pdev, child, port);
 | |
|  		if (IS_ERR(port->base)) {
 | |
|  			dev_err(dev, "%s: cannot map registers\n", port->name);
 | |
|  			port->base = NULL;
 | |
| -			mvebu_pcie_powerdown(port);
 | |
| +			continue;
 | |
| +		}
 | |
| +
 | |
| +		ret = mvebu_pcie_powerup(port);
 | |
| +		if (ret < 0) {
 | |
| +			port->base = NULL;
 | |
|  			continue;
 | |
|  		}
 | |
|  
 |