diff mbox series

[net,1/2] net: phy: DP83822: Fix WoL in config init to be disabled

Message ID 20200423163947.18313-2-dmurphy@ti.com
State Changes Requested
Delegated to: David Miller
Headers show
Series WoL fixes for DP83822 and DP83tc811 | expand

Commit Message

Dan Murphy April 23, 2020, 4:39 p.m. UTC
The WoL feature should be disabled when config_init is called and the
feature should turned on or off  when set_wol is called.

In addition updated the calls to modify the registers to use the set_bit
and clear_bit function calls.

Fixes: 3b427751a9d0 ("net: phy: DP83822 initial driver submission")
Signed-off-by: Dan Murphy <dmurphy@ti.com>
---
 drivers/net/phy/dp83822.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

Comments

Heiner Kallweit April 23, 2020, 5:02 p.m. UTC | #1
On 23.04.2020 18:39, Dan Murphy wrote:
> The WoL feature should be disabled when config_init is called and the
> feature should turned on or off  when set_wol is called.
> 
> In addition updated the calls to modify the registers to use the set_bit
> and clear_bit function calls.
> 
> Fixes: 3b427751a9d0 ("net: phy: DP83822 initial driver submission")
> Signed-off-by: Dan Murphy <dmurphy@ti.com>
> ---
>  drivers/net/phy/dp83822.c | 30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/net/phy/dp83822.c b/drivers/net/phy/dp83822.c
> index fe9aa3ad52a7..40fdfd043947 100644
> --- a/drivers/net/phy/dp83822.c
> +++ b/drivers/net/phy/dp83822.c
> @@ -137,16 +137,19 @@ static int dp83822_set_wol(struct phy_device *phydev,
>  			value &= ~DP83822_WOL_SECURE_ON;
>  		}
>  
> -		value |= (DP83822_WOL_EN | DP83822_WOL_INDICATION_SEL |
> -			  DP83822_WOL_CLR_INDICATION);
> -		phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
> -			      value);
> +		/* Clear any pending WoL interrupt */
> +		phy_read(phydev, MII_DP83822_MISR2);
> +
> +		value |= DP83822_WOL_EN | DP83822_WOL_INDICATION_SEL |
> +			DP83822_WOL_CLR_INDICATION;
> +
> +		return phy_set_bits_mmd(phydev, DP83822_DEVADDR,
> +					MII_DP83822_WOL_CFG, value);

The switch to phy_set_bits_mmd() doesn't seem to be correct here.
So far bit DP83822_WOL_MAGIC_EN is cleared if WAKE_MAGIC isn't set.
Similar for bit DP83822_WOL_SECURE_ON. With your change they don't
get cleared any longer.

>  	} else {
> -		value = phy_read_mmd(phydev, DP83822_DEVADDR,
> -				     MII_DP83822_WOL_CFG);
> -		value &= ~DP83822_WOL_EN;
> -		phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
> -			      value);
> +		value = DP83822_WOL_EN | DP83822_WOL_CLR_INDICATION;
> +
You clear one bit more than before. The reason for this may be worth a note
in the commit message.

> +		return phy_clear_bits_mmd(phydev, DP83822_DEVADDR,
> +					  MII_DP83822_WOL_CFG, value);
>  	}
>  
>  	return 0;
> @@ -258,12 +261,11 @@ static int dp83822_config_intr(struct phy_device *phydev)
>  
>  static int dp83822_config_init(struct phy_device *phydev)
>  {
> -	int value;
> -
> -	value = DP83822_WOL_MAGIC_EN | DP83822_WOL_SECURE_ON | DP83822_WOL_EN;
> +	int value = DP83822_WOL_EN | DP83822_WOL_MAGIC_EN |
> +		    DP83822_WOL_SECURE_ON;
>  
> -	return phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
> -	      value);
> +	return phy_clear_bits_mmd(phydev, DP83822_DEVADDR,
> +				  MII_DP83822_WOL_CFG, value);
>  }
>  
>  static int dp83822_phy_reset(struct phy_device *phydev)
>
Dan Murphy April 23, 2020, 5:49 p.m. UTC | #2
Heiner

On 4/23/20 12:02 PM, Heiner Kallweit wrote:
> On 23.04.2020 18:39, Dan Murphy wrote:
>> The WoL feature should be disabled when config_init is called and the
>> feature should turned on or off  when set_wol is called.
>>
>> In addition updated the calls to modify the registers to use the set_bit
>> and clear_bit function calls.
>>
>> Fixes: 3b427751a9d0 ("net: phy: DP83822 initial driver submission")
>> Signed-off-by: Dan Murphy <dmurphy@ti.com>
>> ---
>>   drivers/net/phy/dp83822.c | 30 ++++++++++++++++--------------
>>   1 file changed, 16 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/net/phy/dp83822.c b/drivers/net/phy/dp83822.c
>> index fe9aa3ad52a7..40fdfd043947 100644
>> --- a/drivers/net/phy/dp83822.c
>> +++ b/drivers/net/phy/dp83822.c
>> @@ -137,16 +137,19 @@ static int dp83822_set_wol(struct phy_device *phydev,
>>   			value &= ~DP83822_WOL_SECURE_ON;
>>   		}
>>   
>> -		value |= (DP83822_WOL_EN | DP83822_WOL_INDICATION_SEL |
>> -			  DP83822_WOL_CLR_INDICATION);
>> -		phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
>> -			      value);
>> +		/* Clear any pending WoL interrupt */
>> +		phy_read(phydev, MII_DP83822_MISR2);
>> +
>> +		value |= DP83822_WOL_EN | DP83822_WOL_INDICATION_SEL |
>> +			DP83822_WOL_CLR_INDICATION;
>> +
>> +		return phy_set_bits_mmd(phydev, DP83822_DEVADDR,
>> +					MII_DP83822_WOL_CFG, value);
> The switch to phy_set_bits_mmd() doesn't seem to be correct here.
> So far bit DP83822_WOL_MAGIC_EN is cleared if WAKE_MAGIC isn't set.
> Similar for bit DP83822_WOL_SECURE_ON. With your change they don't
> get cleared any longer.


Thanks for the review.  I was not watching those bits during my testing 
I will revert back to the original code.

>>   	} else {
>> -		value = phy_read_mmd(phydev, DP83822_DEVADDR,
>> -				     MII_DP83822_WOL_CFG);
>> -		value &= ~DP83822_WOL_EN;
>> -		phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
>> -			      value);
>> +		value = DP83822_WOL_EN | DP83822_WOL_CLR_INDICATION;
>> +
> You clear one bit more than before. The reason for this may be worth a note
> in the commit message.

Thanks this was an artifact from debugging.  I can remove the CLR as it 
was cleared in set_wol enablement.

Dan
diff mbox series

Patch

diff --git a/drivers/net/phy/dp83822.c b/drivers/net/phy/dp83822.c
index fe9aa3ad52a7..40fdfd043947 100644
--- a/drivers/net/phy/dp83822.c
+++ b/drivers/net/phy/dp83822.c
@@ -137,16 +137,19 @@  static int dp83822_set_wol(struct phy_device *phydev,
 			value &= ~DP83822_WOL_SECURE_ON;
 		}
 
-		value |= (DP83822_WOL_EN | DP83822_WOL_INDICATION_SEL |
-			  DP83822_WOL_CLR_INDICATION);
-		phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
-			      value);
+		/* Clear any pending WoL interrupt */
+		phy_read(phydev, MII_DP83822_MISR2);
+
+		value |= DP83822_WOL_EN | DP83822_WOL_INDICATION_SEL |
+			DP83822_WOL_CLR_INDICATION;
+
+		return phy_set_bits_mmd(phydev, DP83822_DEVADDR,
+					MII_DP83822_WOL_CFG, value);
 	} else {
-		value = phy_read_mmd(phydev, DP83822_DEVADDR,
-				     MII_DP83822_WOL_CFG);
-		value &= ~DP83822_WOL_EN;
-		phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
-			      value);
+		value = DP83822_WOL_EN | DP83822_WOL_CLR_INDICATION;
+
+		return phy_clear_bits_mmd(phydev, DP83822_DEVADDR,
+					  MII_DP83822_WOL_CFG, value);
 	}
 
 	return 0;
@@ -258,12 +261,11 @@  static int dp83822_config_intr(struct phy_device *phydev)
 
 static int dp83822_config_init(struct phy_device *phydev)
 {
-	int value;
-
-	value = DP83822_WOL_MAGIC_EN | DP83822_WOL_SECURE_ON | DP83822_WOL_EN;
+	int value = DP83822_WOL_EN | DP83822_WOL_MAGIC_EN |
+		    DP83822_WOL_SECURE_ON;
 
-	return phy_write_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG,
-	      value);
+	return phy_clear_bits_mmd(phydev, DP83822_DEVADDR,
+				  MII_DP83822_WOL_CFG, value);
 }
 
 static int dp83822_phy_reset(struct phy_device *phydev)