* [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps
@ 2019-08-12 21:47 Heiner Kallweit
2019-08-12 21:50 ` [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed Heiner Kallweit
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Heiner Kallweit @ 2019-08-12 21:47 UTC (permalink / raw)
To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev
So far phy_speed_down/up can be used up to 1Gbps only. Remove this
restriction and add needed helpers to phy-core.c
v2:
- remove unused parameter in patch 1
- rename __phy_speed_down to phy_speed_down_core in patch 2
Heiner Kallweit (3):
net: phy: add __set_linkmode_max_speed
net: phy: add phy_speed_down_core and phy_resolve_min_speed
net: phy: let phy_speed_down/up support speeds >1Gbps
drivers/net/phy/phy-core.c | 39 +++++++++++++++++++++++--
drivers/net/phy/phy.c | 60 ++++++++++----------------------------
include/linux/phy.h | 3 ++
3 files changed, 56 insertions(+), 46 deletions(-)
--
2.22.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed
2019-08-12 21:47 [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
@ 2019-08-12 21:50 ` Heiner Kallweit
2019-08-13 20:16 ` Andrew Lunn
2019-08-12 21:51 ` [PATCH net-next v2 2/3] net: phy: add phy_speed_down_core and phy_resolve_min_speed Heiner Kallweit
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Heiner Kallweit @ 2019-08-12 21:50 UTC (permalink / raw)
To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev
We will need the functionality of __set_linkmode_max_speed also for
linkmode bitmaps other than phydev->supported. Therefore split it.
v2:
- remove unused parameter from __set_linkmode_max_speed
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/phy/phy-core.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
index 9ae3abb2d..95f1e85d0 100644
--- a/drivers/net/phy/phy-core.c
+++ b/drivers/net/phy/phy-core.c
@@ -207,14 +207,14 @@ size_t phy_speeds(unsigned int *speeds, size_t size,
return count;
}
-static int __set_phy_supported(struct phy_device *phydev, u32 max_speed)
+static int __set_linkmode_max_speed(u32 max_speed, unsigned long *addr)
{
const struct phy_setting *p;
int i;
for (i = 0, p = settings; i < ARRAY_SIZE(settings); i++, p++) {
if (p->speed > max_speed)
- linkmode_clear_bit(p->bit, phydev->supported);
+ linkmode_clear_bit(p->bit, addr);
else
break;
}
@@ -222,6 +222,11 @@ static int __set_phy_supported(struct phy_device *phydev, u32 max_speed)
return 0;
}
+static int __set_phy_supported(struct phy_device *phydev, u32 max_speed)
+{
+ return __set_linkmode_max_speed(max_speed, phydev->supported);
+}
+
int phy_set_max_speed(struct phy_device *phydev, u32 max_speed)
{
int err;
--
2.22.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 2/3] net: phy: add phy_speed_down_core and phy_resolve_min_speed
2019-08-12 21:47 [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
2019-08-12 21:50 ` [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed Heiner Kallweit
@ 2019-08-12 21:51 ` Heiner Kallweit
2019-08-13 20:16 ` Andrew Lunn
2019-08-12 21:52 ` [PATCH net-next v2 3/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
2019-08-14 0:21 ` [PATCH net-next v2 0/3] " Jakub Kicinski
3 siblings, 1 reply; 7+ messages in thread
From: Heiner Kallweit @ 2019-08-12 21:51 UTC (permalink / raw)
To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev
phy_speed_down_core provides most of the functionality for
phy_speed_down. It makes use of new helper phy_resolve_min_speed that is
based on the sorting of the settings[] array. In certain cases it may be
helpful to be able to exclude legacy half duplex modes, therefore
prepare phy_resolve_min_speed() for it.
v2:
- rename __phy_speed_down to phy_speed_down_core
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/phy/phy-core.c | 28 ++++++++++++++++++++++++++++
include/linux/phy.h | 1 +
2 files changed, 29 insertions(+)
diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
index 95f1e85d0..369903d9b 100644
--- a/drivers/net/phy/phy-core.c
+++ b/drivers/net/phy/phy-core.c
@@ -315,6 +315,34 @@ void phy_resolve_aneg_linkmode(struct phy_device *phydev)
}
EXPORT_SYMBOL_GPL(phy_resolve_aneg_linkmode);
+static int phy_resolve_min_speed(struct phy_device *phydev, bool fdx_only)
+{
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(common);
+ int i = ARRAY_SIZE(settings);
+
+ linkmode_and(common, phydev->lp_advertising, phydev->advertising);
+
+ while (--i >= 0) {
+ if (test_bit(settings[i].bit, common)) {
+ if (fdx_only && settings[i].duplex != DUPLEX_FULL)
+ continue;
+ return settings[i].speed;
+ }
+ }
+
+ return SPEED_UNKNOWN;
+}
+
+int phy_speed_down_core(struct phy_device *phydev)
+{
+ int min_common_speed = phy_resolve_min_speed(phydev, true);
+
+ if (min_common_speed == SPEED_UNKNOWN)
+ return -EINVAL;
+
+ return __set_linkmode_max_speed(min_common_speed, phydev->advertising);
+}
+
static void mmd_phy_indirect(struct mii_bus *bus, int phy_addr, int devad,
u16 regnum)
{
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 781f4810c..62fdc7ff2 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -665,6 +665,7 @@ size_t phy_speeds(unsigned int *speeds, size_t size,
unsigned long *mask);
void of_set_phy_supported(struct phy_device *phydev);
void of_set_phy_eee_broken(struct phy_device *phydev);
+int phy_speed_down_core(struct phy_device *phydev);
/**
* phy_is_started - Convenience function to check whether PHY is started
--
2.22.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 3/3] net: phy: let phy_speed_down/up support speeds >1Gbps
2019-08-12 21:47 [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
2019-08-12 21:50 ` [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed Heiner Kallweit
2019-08-12 21:51 ` [PATCH net-next v2 2/3] net: phy: add phy_speed_down_core and phy_resolve_min_speed Heiner Kallweit
@ 2019-08-12 21:52 ` Heiner Kallweit
2019-08-14 0:21 ` [PATCH net-next v2 0/3] " Jakub Kicinski
3 siblings, 0 replies; 7+ messages in thread
From: Heiner Kallweit @ 2019-08-12 21:52 UTC (permalink / raw)
To: Andrew Lunn, Florian Fainelli, David Miller; +Cc: netdev
So far phy_speed_down/up can be used up to 1Gbps only. Remove this
restriction by using new helper __phy_speed_down. New member adv_old
in struct phy_device is used by phy_speed_up to restore the advertised
modes before calling phy_speed_down. Don't simply advertise what is
supported because a user may have intentionally removed modes from
advertisement.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/phy/phy.c | 60 ++++++++++++-------------------------------
include/linux/phy.h | 2 ++
2 files changed, 18 insertions(+), 44 deletions(-)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index ef7aa738e..f3adea9ef 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -608,38 +608,21 @@ static int phy_poll_aneg_done(struct phy_device *phydev)
*/
int phy_speed_down(struct phy_device *phydev, bool sync)
{
- __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old);
- __ETHTOOL_DECLARE_LINK_MODE_MASK(adv);
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_tmp);
int ret;
if (phydev->autoneg != AUTONEG_ENABLE)
return 0;
- linkmode_copy(adv_old, phydev->advertising);
- linkmode_copy(adv, phydev->lp_advertising);
- linkmode_and(adv, adv, phydev->supported);
-
- if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, adv) ||
- linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, adv)) {
- linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
- phydev->advertising);
- linkmode_clear_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
- phydev->advertising);
- linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
- phydev->advertising);
- linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
- phydev->advertising);
- } else if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
- adv) ||
- linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
- adv)) {
- linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
- phydev->advertising);
- linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
- phydev->advertising);
- }
+ linkmode_copy(adv_tmp, phydev->advertising);
+
+ ret = phy_speed_down_core(phydev);
+ if (ret)
+ return ret;
- if (linkmode_equal(phydev->advertising, adv_old))
+ linkmode_copy(phydev->adv_old, adv_tmp);
+
+ if (linkmode_equal(phydev->advertising, adv_tmp))
return 0;
ret = phy_config_aneg(phydev);
@@ -658,30 +641,19 @@ EXPORT_SYMBOL_GPL(phy_speed_down);
*/
int phy_speed_up(struct phy_device *phydev)
{
- __ETHTOOL_DECLARE_LINK_MODE_MASK(all_speeds) = { 0, };
- __ETHTOOL_DECLARE_LINK_MODE_MASK(not_speeds);
- __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
- __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old);
- __ETHTOOL_DECLARE_LINK_MODE_MASK(speeds);
-
- linkmode_copy(adv_old, phydev->advertising);
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_tmp);
if (phydev->autoneg != AUTONEG_ENABLE)
return 0;
- linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, all_speeds);
- linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, all_speeds);
- linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, all_speeds);
- linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, all_speeds);
- linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, all_speeds);
- linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, all_speeds);
+ if (linkmode_empty(phydev->adv_old))
+ return 0;
- linkmode_andnot(not_speeds, adv_old, all_speeds);
- linkmode_copy(supported, phydev->supported);
- linkmode_and(speeds, supported, all_speeds);
- linkmode_or(phydev->advertising, not_speeds, speeds);
+ linkmode_copy(adv_tmp, phydev->advertising);
+ linkmode_copy(phydev->advertising, phydev->adv_old);
+ linkmode_zero(phydev->adv_old);
- if (linkmode_equal(phydev->advertising, adv_old))
+ if (linkmode_equal(phydev->advertising, adv_tmp))
return 0;
return phy_config_aneg(phydev);
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 62fdc7ff2..5ac7d2137 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -403,6 +403,8 @@ struct phy_device {
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);
+ /* used with phy_speed_down */
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old);
/* Energy efficient ethernet modes which should be prohibited */
u32 eee_broken_modes;
--
2.22.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed
2019-08-12 21:50 ` [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed Heiner Kallweit
@ 2019-08-13 20:16 ` Andrew Lunn
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Lunn @ 2019-08-13 20:16 UTC (permalink / raw)
To: Heiner Kallweit; +Cc: Florian Fainelli, David Miller, netdev
On Mon, Aug 12, 2019 at 11:50:30PM +0200, Heiner Kallweit wrote:
> We will need the functionality of __set_linkmode_max_speed also for
> linkmode bitmaps other than phydev->supported. Therefore split it.
>
> v2:
> - remove unused parameter from __set_linkmode_max_speed
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 2/3] net: phy: add phy_speed_down_core and phy_resolve_min_speed
2019-08-12 21:51 ` [PATCH net-next v2 2/3] net: phy: add phy_speed_down_core and phy_resolve_min_speed Heiner Kallweit
@ 2019-08-13 20:16 ` Andrew Lunn
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Lunn @ 2019-08-13 20:16 UTC (permalink / raw)
To: Heiner Kallweit; +Cc: Florian Fainelli, David Miller, netdev
On Mon, Aug 12, 2019 at 11:51:27PM +0200, Heiner Kallweit wrote:
> phy_speed_down_core provides most of the functionality for
> phy_speed_down. It makes use of new helper phy_resolve_min_speed that is
> based on the sorting of the settings[] array. In certain cases it may be
> helpful to be able to exclude legacy half duplex modes, therefore
> prepare phy_resolve_min_speed() for it.
>
> v2:
> - rename __phy_speed_down to phy_speed_down_core
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps
2019-08-12 21:47 [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
` (2 preceding siblings ...)
2019-08-12 21:52 ` [PATCH net-next v2 3/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
@ 2019-08-14 0:21 ` Jakub Kicinski
3 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2019-08-14 0:21 UTC (permalink / raw)
To: Heiner Kallweit; +Cc: Andrew Lunn, Florian Fainelli, David Miller, netdev
On Mon, 12 Aug 2019 23:47:45 +0200, Heiner Kallweit wrote:
> So far phy_speed_down/up can be used up to 1Gbps only. Remove this
> restriction and add needed helpers to phy-core.c
>
> v2:
> - remove unused parameter in patch 1
> - rename __phy_speed_down to phy_speed_down_core in patch 2
Applied, thanks.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-08-14 0:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-12 21:47 [PATCH net-next v2 0/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
2019-08-12 21:50 ` [PATCH net-next v2 1/3] net: phy: add __set_linkmode_max_speed Heiner Kallweit
2019-08-13 20:16 ` Andrew Lunn
2019-08-12 21:51 ` [PATCH net-next v2 2/3] net: phy: add phy_speed_down_core and phy_resolve_min_speed Heiner Kallweit
2019-08-13 20:16 ` Andrew Lunn
2019-08-12 21:52 ` [PATCH net-next v2 3/3] net: phy: let phy_speed_down/up support speeds >1Gbps Heiner Kallweit
2019-08-14 0:21 ` [PATCH net-next v2 0/3] " Jakub Kicinski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).