mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 14:34:27 -05:00 
			
		
		
		
	Refresh patches on all 4.4 supported platforms. Compile & run tested: brcm2708/bcm2710 - Raspberry Pi 3 Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Timur Tabi <timur@codeaurora.org>
 | 
						|
Date: Tue, 26 Apr 2016 12:44:18 -0500
 | 
						|
Subject: [PATCH] net: phy: at803x: only the AT8030 needs a hardware reset on
 | 
						|
 link change
 | 
						|
 | 
						|
Commit 13a56b44 ("at803x: Add support for hardware reset") added a
 | 
						|
work-around for a hardware bug on the AT8030.  However, the work-around
 | 
						|
was being called for all 803x PHYs, even those that don't need it.
 | 
						|
Function at803x_link_change_notify() checks to make sure that it only
 | 
						|
resets the PHY on the 8030, but it makes more sense to not call that
 | 
						|
function at all if it isn't needed.
 | 
						|
 | 
						|
Signed-off-by: Timur Tabi <timur@codeaurora.org>
 | 
						|
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
 | 
						|
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
						|
---
 | 
						|
 | 
						|
--- a/drivers/net/phy/at803x.c
 | 
						|
+++ b/drivers/net/phy/at803x.c
 | 
						|
@@ -374,27 +374,25 @@ static void at803x_link_change_notify(st
 | 
						|
 	 * in the FIFO. In such cases, the FIFO enters an error mode it
 | 
						|
 	 * cannot recover from by software.
 | 
						|
 	 */
 | 
						|
-	if (phydev->drv->phy_id == ATH8030_PHY_ID) {
 | 
						|
-		if (phydev->state == PHY_NOLINK) {
 | 
						|
-			if (priv->gpiod_reset && !priv->phy_reset) {
 | 
						|
-				struct at803x_context context;
 | 
						|
-
 | 
						|
-				at803x_context_save(phydev, &context);
 | 
						|
-
 | 
						|
-				gpiod_set_value(priv->gpiod_reset, 1);
 | 
						|
-				msleep(1);
 | 
						|
-				gpiod_set_value(priv->gpiod_reset, 0);
 | 
						|
-				msleep(1);
 | 
						|
-
 | 
						|
-				at803x_context_restore(phydev, &context);
 | 
						|
-
 | 
						|
-				dev_dbg(&phydev->dev, "%s(): phy was reset\n",
 | 
						|
-					__func__);
 | 
						|
-				priv->phy_reset = true;
 | 
						|
-			}
 | 
						|
-		} else {
 | 
						|
-			priv->phy_reset = false;
 | 
						|
+	if (phydev->state == PHY_NOLINK) {
 | 
						|
+		if (priv->gpiod_reset && !priv->phy_reset) {
 | 
						|
+			struct at803x_context context;
 | 
						|
+
 | 
						|
+			at803x_context_save(phydev, &context);
 | 
						|
+
 | 
						|
+			gpiod_set_value(priv->gpiod_reset, 1);
 | 
						|
+			msleep(1);
 | 
						|
+			gpiod_set_value(priv->gpiod_reset, 0);
 | 
						|
+			msleep(1);
 | 
						|
+
 | 
						|
+			at803x_context_restore(phydev, &context);
 | 
						|
+
 | 
						|
+			dev_dbg(&phydev->dev, "%s(): phy was reset\n",
 | 
						|
+				__func__);
 | 
						|
+			priv->phy_reset = true;
 | 
						|
 		}
 | 
						|
+	} else {
 | 
						|
+		priv->phy_reset = false;
 | 
						|
 	}
 | 
						|
 	if (pdata && pdata->fixup_rgmii_tx_delay &&
 | 
						|
 	    phydev->speed != priv->prev_speed) {
 | 
						|
@@ -426,7 +424,6 @@ static struct phy_driver at803x_driver[]
 | 
						|
 	.phy_id_mask		= AT803X_PHY_ID_MASK,
 | 
						|
 	.probe			= at803x_probe,
 | 
						|
 	.config_init		= at803x_config_init,
 | 
						|
-	.link_change_notify	= at803x_link_change_notify,
 | 
						|
 	.set_wol		= at803x_set_wol,
 | 
						|
 	.get_wol		= at803x_get_wol,
 | 
						|
 	.suspend		= at803x_suspend,
 | 
						|
@@ -468,7 +465,6 @@ static struct phy_driver at803x_driver[]
 | 
						|
 	.phy_id_mask		= AT803X_PHY_ID_MASK,
 | 
						|
 	.probe			= at803x_probe,
 | 
						|
 	.config_init		= at803x_config_init,
 | 
						|
-	.link_change_notify	= at803x_link_change_notify,
 | 
						|
 	.set_wol		= at803x_set_wol,
 | 
						|
 	.get_wol		= at803x_get_wol,
 | 
						|
 	.suspend		= at803x_suspend,
 |