diff mbox

net: phy: workaround for buggy cable detection by LAN8700 after cable plugging

Message ID 1439471556-13760-1-git-send-email-plyatov@gmail.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Igor Plyatov Aug. 13, 2015, 1:12 p.m. UTC
* Due to HW bug, LAN8700 sometimes does not detect presence of energy in the
  Ethernet cable in Energy Detect Power-Down mode (e.g while EDPWRDOWN bit is
  set, the ENERGYON bit does not asserted sometimes). This is a common bug of
  LAN87xx family of PHY chips.
* The lan87xx_read_status() was improved to acquire ENERGYON bit. Its previous
  algorythm still not reliable on 100 % and sometimes skip cable plugging.

Signed-off-by: Igor Plyatov <plyatov@gmail.com>
---
 drivers/net/phy/smsc.c |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

Comments

Joe Perches Aug. 13, 2015, 4:50 p.m. UTC | #1
On Thu, 2015-08-13 at 16:12 +0300, Igor Plyatov wrote:
> * Due to HW bug, LAN8700 sometimes does not detect presence of energy in the
>   Ethernet cable in Energy Detect Power-Down mode (e.g while EDPWRDOWN bit is
>   set, the ENERGYON bit does not asserted sometimes). This is a common bug of
>   LAN87xx family of PHY chips.
> * The lan87xx_read_status() was improved to acquire ENERGYON bit. Its previous
>   algorythm still not reliable on 100 % and sometimes skip cable plugging.
[]
> diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
[]
> @@ -104,10 +104,12 @@ static int lan911x_config_init(struct phy_device *phydev)
>  static int lan87xx_read_status(struct phy_device *phydev)
>  {
>  	int err = genphy_read_status(phydev);
> +	int rc;

Is there a reason to move this declaration?

> +	int i;
>  
>  	if (!phydev->link) {
>  		/* Disable EDPD to wake up PHY */
> -		int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
> +		rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
>  		if (rc < 0)
>  			return rc;
>  


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Igor Plyatov Aug. 13, 2015, 5:11 p.m. UTC | #2
Dear Joe,

> On Thu, 2015-08-13 at 16:12 +0300, Igor Plyatov wrote:
>> * Due to HW bug, LAN8700 sometimes does not detect presence of energy in the
>>    Ethernet cable in Energy Detect Power-Down mode (e.g while EDPWRDOWN bit is
>>    set, the ENERGYON bit does not asserted sometimes). This is a common bug of
>>    LAN87xx family of PHY chips.
>> * The lan87xx_read_status() was improved to acquire ENERGYON bit. Its previous
>>    algorythm still not reliable on 100 % and sometimes skip cable plugging.
> []
>> diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
> []
>> @@ -104,10 +104,12 @@ static int lan911x_config_init(struct phy_device *phydev)
>>   static int lan87xx_read_status(struct phy_device *phydev)
>>   {
>>   	int err = genphy_read_status(phydev);
>> +	int rc;
> Is there a reason to move this declaration?

There is no strict requirement to move declaration of the rc.
It was made just to have all declarations easily visible.

>> +	int i;
>>   
>>   	if (!phydev->link) {
>>   		/* Disable EDPD to wake up PHY */
>> -		int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
>> +		rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
>>   		if (rc < 0)
>>   			return rc;
>>   
>

Best wishes
--
Igor Plyatov
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Joe Perches Aug. 13, 2015, 5:15 p.m. UTC | #3
On Thu, 2015-08-13 at 20:11 +0300, Igor Plyatov wrote:
> > On Thu, 2015-08-13 at 16:12 +0300, Igor Plyatov wrote:
> >> * Due to HW bug, LAN8700 sometimes does not detect presence of energy in the
> >>    Ethernet cable in Energy Detect Power-Down mode (e.g while EDPWRDOWN bit is
> >>    set, the ENERGYON bit does not asserted sometimes). This is a common bug of
> >>    LAN87xx family of PHY chips.
> >> * The lan87xx_read_status() was improved to acquire ENERGYON bit. Its previous
> >>    algorythm still not reliable on 100 % and sometimes skip cable plugging.
> > []
> >> diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
> > []
> >> @@ -104,10 +104,12 @@ static int lan911x_config_init(struct phy_device *phydev)
> >>   static int lan87xx_read_status(struct phy_device *phydev)
> >>   {
> >>   	int err = genphy_read_status(phydev);
> >> +	int rc;
> > Is there a reason to move this declaration?
> 
> There is no strict requirement to move declaration of the rc.
> It was made just to have all declarations easily visible.

Generally it's better to have declarations
in the minimal/narrowest scope possible.


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Aug. 13, 2015, 6:37 p.m. UTC | #4
From: Joe Perches <joe@perches.com>
Date: Thu, 13 Aug 2015 10:15:15 -0700

> On Thu, 2015-08-13 at 20:11 +0300, Igor Plyatov wrote:
>> > On Thu, 2015-08-13 at 16:12 +0300, Igor Plyatov wrote:
>> >> * Due to HW bug, LAN8700 sometimes does not detect presence of energy in the
>> >>    Ethernet cable in Energy Detect Power-Down mode (e.g while EDPWRDOWN bit is
>> >>    set, the ENERGYON bit does not asserted sometimes). This is a common bug of
>> >>    LAN87xx family of PHY chips.
>> >> * The lan87xx_read_status() was improved to acquire ENERGYON bit. Its previous
>> >>    algorythm still not reliable on 100 % and sometimes skip cable plugging.
>> > []
>> >> diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
>> > []
>> >> @@ -104,10 +104,12 @@ static int lan911x_config_init(struct phy_device *phydev)
>> >>   static int lan87xx_read_status(struct phy_device *phydev)
>> >>   {
>> >>   	int err = genphy_read_status(phydev);
>> >> +	int rc;
>> > Is there a reason to move this declaration?
>> 
>> There is no strict requirement to move declaration of the rc.
>> It was made just to have all declarations easily visible.
> 
> Generally it's better to have declarations
> in the minimal/narrowest scope possible.

Agreed, and it's %100 unrelated to the purpose of this patch so not
should be included for that reason as well.

You will need to respin this patch with the variable moving elided.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Igor Plyatov Aug. 13, 2015, 7:23 p.m. UTC | #5
Dear David and Joe,

thank you for patch review!

Please look at email with subject
"[PATCH v2] net: phy: workaround for buggy cable detection by LAN8700 
after cable plugging"

Best wishes.
--
Igor Plyatov

> From: Joe Perches <joe@perches.com>
> Date: Thu, 13 Aug 2015 10:15:15 -0700
>
>> On Thu, 2015-08-13 at 20:11 +0300, Igor Plyatov wrote:
>>>> On Thu, 2015-08-13 at 16:12 +0300, Igor Plyatov wrote:
>>>>> * Due to HW bug, LAN8700 sometimes does not detect presence of energy in the
>>>>>     Ethernet cable in Energy Detect Power-Down mode (e.g while EDPWRDOWN bit is
>>>>>     set, the ENERGYON bit does not asserted sometimes). This is a common bug of
>>>>>     LAN87xx family of PHY chips.
>>>>> * The lan87xx_read_status() was improved to acquire ENERGYON bit. Its previous
>>>>>     algorythm still not reliable on 100 % and sometimes skip cable plugging.
>>>> []
>>>>> diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
>>>> []
>>>>> @@ -104,10 +104,12 @@ static int lan911x_config_init(struct phy_device *phydev)
>>>>>    static int lan87xx_read_status(struct phy_device *phydev)
>>>>>    {
>>>>>    	int err = genphy_read_status(phydev);
>>>>> +	int rc;
>>>> Is there a reason to move this declaration?
>>> There is no strict requirement to move declaration of the rc.
>>> It was made just to have all declarations easily visible.
>> Generally it's better to have declarations
>> in the minimal/narrowest scope possible.
> Agreed, and it's %100 unrelated to the purpose of this patch so not
> should be included for that reason as well.
>
> You will need to respin this patch with the variable moving elided.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c
index c0f6479..a380958 100644
--- a/drivers/net/phy/smsc.c
+++ b/drivers/net/phy/smsc.c
@@ -104,10 +104,12 @@  static int lan911x_config_init(struct phy_device *phydev)
 static int lan87xx_read_status(struct phy_device *phydev)
 {
 	int err = genphy_read_status(phydev);
+	int rc;
+	int i;
 
 	if (!phydev->link) {
 		/* Disable EDPD to wake up PHY */
-		int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
+		rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
 		if (rc < 0)
 			return rc;
 
@@ -116,8 +118,16 @@  static int lan87xx_read_status(struct phy_device *phydev)
 		if (rc < 0)
 			return rc;
 
-		/* Sleep 64 ms to allow ~5 link test pulses to be sent */
-		msleep(64);
+		/* Wait max 640 ms to detect energy */
+		for (i = 0; i < 64; i++) {
+			/* Sleep to allow link test pulses to be sent */
+			msleep(10);
+			rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
+			if (rc < 0)
+				return rc;
+			if (rc & MII_LAN83C185_ENERGYON)
+				break;
+		};
 
 		/* Re-enable EDPD */
 		rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
@@ -191,7 +201,7 @@  static struct phy_driver smsc_phy_driver[] = {
 
 	/* basic functions */
 	.config_aneg	= genphy_config_aneg,
-	.read_status	= genphy_read_status,
+	.read_status	= lan87xx_read_status,
 	.config_init	= smsc_phy_config_init,
 	.soft_reset	= smsc_phy_reset,