39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/drivers/net/phy/at803x.c
 | |
| +++ b/drivers/net/phy/at803x.c
 | |
| @@ -460,12 +460,15 @@ static void at803x_link_change_notify(st
 | |
|  
 | |
|  static int at803x_aneg_done(struct phy_device *phydev)
 | |
|  {
 | |
| +	struct at803x_platform_data *pdata;
 | |
|  	int ccr;
 | |
|  
 | |
|  	int aneg_done = genphy_aneg_done(phydev);
 | |
|  	if (aneg_done != BMSR_ANEGCOMPLETE)
 | |
|  		return aneg_done;
 | |
|  
 | |
| +	pdata = dev_get_platdata(&phydev->mdio.dev);
 | |
| +
 | |
|  	/*
 | |
|  	 * in SGMII mode, if copper side autoneg is successful,
 | |
|  	 * also check SGMII side autoneg result
 | |
| @@ -480,7 +483,8 @@ static int at803x_aneg_done(struct phy_d
 | |
|  	/* check if the SGMII link is OK. */
 | |
|  	if (!(phy_read(phydev, AT803X_PSSR) & AT803X_PSSR_MR_AN_COMPLETE)) {
 | |
|  		pr_warn("803x_aneg_done: SGMII link is not ok\n");
 | |
| -		aneg_done = 0;
 | |
| +		if (!pdata || !pdata->override_sgmii_aneg)
 | |
| +			aneg_done = 0;
 | |
|  	}
 | |
|  	/* switch back to copper page */
 | |
|  	phy_write(phydev, AT803X_REG_CHIP_CONFIG, ccr | AT803X_BT_BX_REG_SEL);
 | |
| --- a/include/linux/platform_data/phy-at803x.h
 | |
| +++ b/include/linux/platform_data/phy-at803x.h
 | |
| @@ -7,6 +7,7 @@ struct at803x_platform_data {
 | |
|  	int enable_rgmii_rx_delay:1;
 | |
|  	int fixup_rgmii_tx_delay:1;
 | |
|  	int has_reset_gpio:1;
 | |
| +	int override_sgmii_aneg:1;
 | |
|  	int reset_gpio;
 | |
|  };
 | |
|  
 | 
