diff mbox series

[net-next] r8169: copy vendor driver 2.5G/5G EEE advertisement constraints

Message ID 4677d3c4-60e2-4094-81a8-adae42ca46bb@gmail.com (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series [net-next] r8169: copy vendor driver 2.5G/5G EEE advertisement constraints | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 3 this patch: 3
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang success Errors and warnings before: 3 this patch: 3
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 4 this patch: 4
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 53 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest success net-next-2024-11-06--12-00 (tests: 782)

Commit Message

Heiner Kallweit Nov. 4, 2024, 10:07 p.m. UTC
Vendor driver r8125 doesn't advertise 2.5G EEE on RTL8125A, and r8126
doesn't advertise 5G EEE. Likely there are compatibility issues,
therefore do the same in r8169.
With this change we don't have to disable 2.5G EEE advertisement in
rtl8125a_config_eee_phy() any longer.
Note: We don't remove the potentially problematic modes from the
supported modes, so users can re-enable advertisement of these modes
if they work fine in their setup.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/ethernet/realtek/r8169_main.c       |  7 +++++++
 drivers/net/ethernet/realtek/r8169_phy_config.c | 16 ++++------------
 2 files changed, 11 insertions(+), 12 deletions(-)

Comments

Andrew Lunn Nov. 5, 2024, 9:06 p.m. UTC | #1
On Mon, Nov 04, 2024 at 11:07:20PM +0100, Heiner Kallweit wrote:
> Vendor driver r8125 doesn't advertise 2.5G EEE on RTL8125A, and r8126
> doesn't advertise 5G EEE. Likely there are compatibility issues,
> therefore do the same in r8169.
> With this change we don't have to disable 2.5G EEE advertisement in
> rtl8125a_config_eee_phy() any longer.
> Note: We don't remove the potentially problematic modes from the
> supported modes, so users can re-enable advertisement of these modes
> if they work fine in their setup.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> ---
>  drivers/net/ethernet/realtek/r8169_main.c       |  7 +++++++
>  drivers/net/ethernet/realtek/r8169_phy_config.c | 16 ++++------------
>  2 files changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
> index e83c4841b..4f37d25e0 100644
> --- a/drivers/net/ethernet/realtek/r8169_main.c
> +++ b/drivers/net/ethernet/realtek/r8169_main.c
> @@ -5318,6 +5318,13 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
>  		phy_support_eee(tp->phydev);
>  	phy_support_asym_pause(tp->phydev);
>  
> +	/* mimic behavior of r8125/r8126 vendor drivers */
> +	if (tp->mac_version == RTL_GIGA_MAC_VER_61)
> +		linkmode_clear_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
> +				   tp->phydev->advertising_eee);
> +	linkmode_clear_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
> +			   tp->phydev->advertising_eee);

Hi Heiner

phy_device.c has:

/**
 * phy_remove_link_mode - Remove a supported link mode
 * @phydev: phy_device structure to remove link mode from
 * @link_mode: Link mode to be removed
 *
 * Description: Some MACs don't support all link modes which the PHY
 * does.  e.g. a 1G MAC often does not support 1000Half. Add a helper
 * to remove a link mode.
 */
void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
{
        linkmode_clear_bit(link_mode, phydev->supported);
        phy_advertise_supported(phydev);
}
EXPORT_SYMBOL(phy_remove_link_mode);

Maybe we need a phy_remove_eee_link_mode()? That could also remove it
from supported? At minimum, it would stop MAC drivers poking around
the insides of phylib.

	Andrew
Heiner Kallweit Nov. 5, 2024, 10:50 p.m. UTC | #2
On 05.11.2024 22:06, Andrew Lunn wrote:
> On Mon, Nov 04, 2024 at 11:07:20PM +0100, Heiner Kallweit wrote:
>> Vendor driver r8125 doesn't advertise 2.5G EEE on RTL8125A, and r8126
>> doesn't advertise 5G EEE. Likely there are compatibility issues,
>> therefore do the same in r8169.
>> With this change we don't have to disable 2.5G EEE advertisement in
>> rtl8125a_config_eee_phy() any longer.
>> Note: We don't remove the potentially problematic modes from the
>> supported modes, so users can re-enable advertisement of these modes
>> if they work fine in their setup.
>>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> ---
>>  drivers/net/ethernet/realtek/r8169_main.c       |  7 +++++++
>>  drivers/net/ethernet/realtek/r8169_phy_config.c | 16 ++++------------
>>  2 files changed, 11 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
>> index e83c4841b..4f37d25e0 100644
>> --- a/drivers/net/ethernet/realtek/r8169_main.c
>> +++ b/drivers/net/ethernet/realtek/r8169_main.c
>> @@ -5318,6 +5318,13 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
>>  		phy_support_eee(tp->phydev);
>>  	phy_support_asym_pause(tp->phydev);
>>  
>> +	/* mimic behavior of r8125/r8126 vendor drivers */
>> +	if (tp->mac_version == RTL_GIGA_MAC_VER_61)
>> +		linkmode_clear_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
>> +				   tp->phydev->advertising_eee);
>> +	linkmode_clear_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
>> +			   tp->phydev->advertising_eee);
> 
> Hi Heiner
> 
> phy_device.c has:
> 
> /**
>  * phy_remove_link_mode - Remove a supported link mode
>  * @phydev: phy_device structure to remove link mode from
>  * @link_mode: Link mode to be removed
>  *
>  * Description: Some MACs don't support all link modes which the PHY
>  * does.  e.g. a 1G MAC often does not support 1000Half. Add a helper
>  * to remove a link mode.
>  */
> void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
> {
>         linkmode_clear_bit(link_mode, phydev->supported);
>         phy_advertise_supported(phydev);
> }
> EXPORT_SYMBOL(phy_remove_link_mode);
> 
> Maybe we need a phy_remove_eee_link_mode()? That could also remove it
> from supported? At minimum, it would stop MAC drivers poking around
> the insides of phylib.
> 
I just do it in the MAC driver because PHY drivers don't have a good
place to initially disable a certain (EEE) mode.
Modifying the advertisement register in get_features(), so that
genphy_c45_read_eee_adv() reads the desired advertisement, would be
somewhat hacky.
My use case "remove a mode from advertisement initially, but keep it
in supported modes, so that user can re-enable it" isn't really supported
as of today. Of course we could add a simple setter like

void phy_remove_eee_mode_from_advertising(struct phy_device *phydev, u32 link_mode)
{
	linkmode_clear_bit(link_mode, phydev->advertising_eee);
}

But would this be worth it?

> 	Andrew

Heiner
Heiner Kallweit Nov. 6, 2024, 1:28 p.m. UTC | #3
On 05.11.2024 22:06, Andrew Lunn wrote:
> On Mon, Nov 04, 2024 at 11:07:20PM +0100, Heiner Kallweit wrote:
>> Vendor driver r8125 doesn't advertise 2.5G EEE on RTL8125A, and r8126
>> doesn't advertise 5G EEE. Likely there are compatibility issues,
>> therefore do the same in r8169.
>> With this change we don't have to disable 2.5G EEE advertisement in
>> rtl8125a_config_eee_phy() any longer.
>> Note: We don't remove the potentially problematic modes from the
>> supported modes, so users can re-enable advertisement of these modes
>> if they work fine in their setup.
>>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> ---
>>  drivers/net/ethernet/realtek/r8169_main.c       |  7 +++++++
>>  drivers/net/ethernet/realtek/r8169_phy_config.c | 16 ++++------------
>>  2 files changed, 11 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
>> index e83c4841b..4f37d25e0 100644
>> --- a/drivers/net/ethernet/realtek/r8169_main.c
>> +++ b/drivers/net/ethernet/realtek/r8169_main.c
>> @@ -5318,6 +5318,13 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
>>  		phy_support_eee(tp->phydev);
>>  	phy_support_asym_pause(tp->phydev);
>>  
>> +	/* mimic behavior of r8125/r8126 vendor drivers */
>> +	if (tp->mac_version == RTL_GIGA_MAC_VER_61)
>> +		linkmode_clear_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
>> +				   tp->phydev->advertising_eee);
>> +	linkmode_clear_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
>> +			   tp->phydev->advertising_eee);
> 
> Hi Heiner
> 
> phy_device.c has:
> 
> /**
>  * phy_remove_link_mode - Remove a supported link mode
>  * @phydev: phy_device structure to remove link mode from
>  * @link_mode: Link mode to be removed
>  *
>  * Description: Some MACs don't support all link modes which the PHY
>  * does.  e.g. a 1G MAC often does not support 1000Half. Add a helper
>  * to remove a link mode.
>  */
> void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
> {
>         linkmode_clear_bit(link_mode, phydev->supported);
>         phy_advertise_supported(phydev);
> }
> EXPORT_SYMBOL(phy_remove_link_mode);
> 
> Maybe we need a phy_remove_eee_link_mode()? That could also remove it
> from supported? At minimum, it would stop MAC drivers poking around
> the insides of phylib.
> 
After checking eee_broken_modes in more detail:
In general it does what I need, it prevents broken EEE modes from being
advertised. Some challenges:

- eee_broken_modes currently represents eee_cap1 register bits.
  So it's not possible to flag 2.5G or 5G EEE as broken.
  - We would have to change eee_broken_modes to a linkmode bitmap.

- eee_broken_modes can be populated via DT only.
  of_set_phy_eee_broken() would have to be changed to operate on
  fwnodes. Then I may be able to "inject" the broken modes in my
  case as swnode's.
  Not the easiest solution, but maybe the cleanest. Feedback welcome.

> 	Andrew
Heiner
Andrew Lunn Nov. 6, 2024, 3:22 p.m. UTC | #4
On Wed, Nov 06, 2024 at 02:28:54PM +0100, Heiner Kallweit wrote:
> On 05.11.2024 22:06, Andrew Lunn wrote:
> > On Mon, Nov 04, 2024 at 11:07:20PM +0100, Heiner Kallweit wrote:
> >> Vendor driver r8125 doesn't advertise 2.5G EEE on RTL8125A, and r8126
> >> doesn't advertise 5G EEE. Likely there are compatibility issues,
> >> therefore do the same in r8169.
> >> With this change we don't have to disable 2.5G EEE advertisement in
> >> rtl8125a_config_eee_phy() any longer.
> >> Note: We don't remove the potentially problematic modes from the
> >> supported modes, so users can re-enable advertisement of these modes
> >> if they work fine in their setup.
> >>
> >> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> >> ---
> >>  drivers/net/ethernet/realtek/r8169_main.c       |  7 +++++++
> >>  drivers/net/ethernet/realtek/r8169_phy_config.c | 16 ++++------------
> >>  2 files changed, 11 insertions(+), 12 deletions(-)
> >>
> >> diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
> >> index e83c4841b..4f37d25e0 100644
> >> --- a/drivers/net/ethernet/realtek/r8169_main.c
> >> +++ b/drivers/net/ethernet/realtek/r8169_main.c
> >> @@ -5318,6 +5318,13 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
> >>  		phy_support_eee(tp->phydev);
> >>  	phy_support_asym_pause(tp->phydev);
> >>  
> >> +	/* mimic behavior of r8125/r8126 vendor drivers */
> >> +	if (tp->mac_version == RTL_GIGA_MAC_VER_61)
> >> +		linkmode_clear_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
> >> +				   tp->phydev->advertising_eee);
> >> +	linkmode_clear_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
> >> +			   tp->phydev->advertising_eee);
> > 
> > Hi Heiner
> > 
> > phy_device.c has:
> > 
> > /**
> >  * phy_remove_link_mode - Remove a supported link mode
> >  * @phydev: phy_device structure to remove link mode from
> >  * @link_mode: Link mode to be removed
> >  *
> >  * Description: Some MACs don't support all link modes which the PHY
> >  * does.  e.g. a 1G MAC often does not support 1000Half. Add a helper
> >  * to remove a link mode.
> >  */
> > void phy_remove_link_mode(struct phy_device *phydev, u32 link_mode)
> > {
> >         linkmode_clear_bit(link_mode, phydev->supported);
> >         phy_advertise_supported(phydev);
> > }
> > EXPORT_SYMBOL(phy_remove_link_mode);
> > 
> > Maybe we need a phy_remove_eee_link_mode()? That could also remove it
> > from supported? At minimum, it would stop MAC drivers poking around
> > the insides of phylib.
> > 
> After checking eee_broken_modes in more detail:
> In general it does what I need, it prevents broken EEE modes from being
> advertised. Some challenges:
> 
> - eee_broken_modes currently represents eee_cap1 register bits.
>   So it's not possible to flag 2.5G or 5G EEE as broken.
>   - We would have to change eee_broken_modes to a linkmode bitmap.
> 
> - eee_broken_modes can be populated via DT only.
>   of_set_phy_eee_broken() would have to be changed to operate on
>   fwnodes. Then I may be able to "inject" the broken modes in my
>   case as swnode's.
>   Not the easiest solution, but maybe the cleanest. Feedback welcome.

I probably would not go as far as adding swnode support for something
so simple. Just add phy_remove_eee_link_mode() or maybe
phy_set_eee_broken() as i suggested to set bits in
phydev->eee_broken_modes.

And converting it to a linkmode bitmap is probably needed in the long
term anyway. the change does not look too invasive, eee_broken_mode is
not used in many places.

I say go for it.

	Andrew
diff mbox series

Patch

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index e83c4841b..4f37d25e0 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -5318,6 +5318,13 @@  static int r8169_mdio_register(struct rtl8169_private *tp)
 		phy_support_eee(tp->phydev);
 	phy_support_asym_pause(tp->phydev);
 
+	/* mimic behavior of r8125/r8126 vendor drivers */
+	if (tp->mac_version == RTL_GIGA_MAC_VER_61)
+		linkmode_clear_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
+				   tp->phydev->advertising_eee);
+	linkmode_clear_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
+			   tp->phydev->advertising_eee);
+
 	/* PHY will be woken up in rtl_open() */
 	phy_suspend(tp->phydev);
 
diff --git a/drivers/net/ethernet/realtek/r8169_phy_config.c b/drivers/net/ethernet/realtek/r8169_phy_config.c
index 1d5b33f6c..5307c6ff4 100644
--- a/drivers/net/ethernet/realtek/r8169_phy_config.c
+++ b/drivers/net/ethernet/realtek/r8169_phy_config.c
@@ -96,15 +96,7 @@  static void rtl8125_common_config_eee_phy(struct phy_device *phydev)
 	phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000);
 }
 
-static void rtl8125a_config_eee_phy(struct phy_device *phydev)
-{
-	rtl8168g_config_eee_phy(phydev);
-	/* disable EEE at 2.5Gbps */
-	phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000);
-	rtl8125_common_config_eee_phy(phydev);
-}
-
-static void rtl8125b_config_eee_phy(struct phy_device *phydev)
+static void rtl8125_config_eee_phy(struct phy_device *phydev)
 {
 	rtl8168g_config_eee_phy(phydev);
 	rtl8125_common_config_eee_phy(phydev);
@@ -1066,7 +1058,7 @@  static void rtl8125a_2_hw_phy_config(struct rtl8169_private *tp,
 	rtl8168g_enable_gphy_10m(phydev);
 
 	rtl8168g_disable_aldps(phydev);
-	rtl8125a_config_eee_phy(phydev);
+	rtl8125_config_eee_phy(phydev);
 }
 
 static void rtl8125b_hw_phy_config(struct rtl8169_private *tp,
@@ -1106,7 +1098,7 @@  static void rtl8125b_hw_phy_config(struct rtl8169_private *tp,
 
 	rtl8125_legacy_force_mode(phydev);
 	rtl8168g_disable_aldps(phydev);
-	rtl8125b_config_eee_phy(phydev);
+	rtl8125_config_eee_phy(phydev);
 }
 
 static void rtl8125d_hw_phy_config(struct rtl8169_private *tp,
@@ -1116,7 +1108,7 @@  static void rtl8125d_hw_phy_config(struct rtl8169_private *tp,
 	rtl8168g_enable_gphy_10m(phydev);
 	rtl8125_legacy_force_mode(phydev);
 	rtl8168g_disable_aldps(phydev);
-	rtl8125b_config_eee_phy(phydev);
+	rtl8125_config_eee_phy(phydev);
 }
 
 static void rtl8126a_hw_phy_config(struct rtl8169_private *tp,