net: ethtool: Add PSE port priority support feature

This patch expands the status information provided by ethtool for PSE c33
with current port priority and max port priority. It also adds a call to
pse_ethtool_set_prio() to configure the PSE port priority.

Signed-off-by: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
Reviewed-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://patch.msgid.link/20250617-feature_poe_port_prio-v14-8-78a1a645e2ee@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Kory Maincent (Dent Project) 2025-06-17 14:12:07 +02:00 committed by Jakub Kicinski
parent ffef61d6d2
commit eeb0c8f72f
4 changed files with 57 additions and 0 deletions

View File

@ -1436,6 +1436,14 @@ attribute-sets:
name: pse-pw-d-id
type: u32
name-prefix: ethtool-a-
-
name: pse-prio-max
type: u32
name-prefix: ethtool-a-
-
name: pse-prio
type: u32
name-prefix: ethtool-a-
-
name: rss
attr-cnt-name: __ethtool-a-rss-cnt
@ -2260,6 +2268,8 @@ operations:
- c33-pse-avail-pw-limit
- c33-pse-pw-limit-ranges
- pse-pw-d-id
- pse-prio-max
- pse-prio
dump: *pse-get-op
-
name: pse-set
@ -2274,6 +2284,7 @@ operations:
- podl-pse-admin-control
- c33-pse-admin-control
- c33-pse-avail-pw-limit
- pse-prio
-
name: rss-get
doc: Get RSS params.

View File

@ -1790,6 +1790,10 @@ Kernel response contents:
``ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES`` nested Supported power limit
configuration ranges.
``ETHTOOL_A_PSE_PW_D_ID`` u32 Index of the PSE power domain
``ETHTOOL_A_PSE_PRIO_MAX`` u32 Priority maximum configurable
on the PoE PSE
``ETHTOOL_A_PSE_PRIO`` u32 Priority of the PoE PSE
currently configured
========================================== ====== =============================
When set, the optional ``ETHTOOL_A_PODL_PSE_ADMIN_STATE`` attribute identifies
@ -1866,6 +1870,12 @@ equal.
The ``ETHTOOL_A_PSE_PW_D_ID`` attribute identifies the index of PSE power
domain.
When set, the optional ``ETHTOOL_A_PSE_PRIO_MAX`` attribute identifies
the PSE maximum priority value.
When set, the optional ``ETHTOOL_A_PSE_PRIO`` attributes is used to
identifies the currently configured PSE priority.
For a description of PSE priority attributes, see ``PSE_SET``.
PSE_SET
=======
@ -1879,6 +1889,8 @@ Request contents:
``ETHTOOL_A_C33_PSE_ADMIN_CONTROL`` u32 Control PSE Admin state
``ETHTOOL_A_C33_PSE_AVAIL_PWR_LIMIT`` u32 Control PoE PSE available
power limit
``ETHTOOL_A_PSE_PRIO`` u32 Control priority of the
PoE PSE
====================================== ====== =============================
When set, the optional ``ETHTOOL_A_PODL_PSE_ADMIN_CONTROL`` attribute is used
@ -1901,6 +1913,20 @@ various existing products that document power consumption in watts rather than
classes. If power limit configuration based on classes is needed, the
conversion can be done in user space, for example by ethtool.
When set, the optional ``ETHTOOL_A_PSE_PRIO`` attributes is used to
control the PSE priority. Allowed priority value are between zero and
the value of ``ETHTOOL_A_PSE_PRIO_MAX`` attribute.
A lower value indicates a higher priority, meaning that a priority value
of 0 corresponds to the highest port priority.
Port priority serves two functions:
- Power-up Order: After a reset, ports are powered up in order of their
priority from highest to lowest. Ports with higher priority
(lower values) power up first.
- Shutdown Order: When the power budget is exceeded, ports with lower
priority (higher values) are turned off first.
PSE_NTF
=======

View File

@ -671,6 +671,8 @@ enum {
ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT,
ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES,
ETHTOOL_A_PSE_PW_D_ID,
ETHTOOL_A_PSE_PRIO_MAX,
ETHTOOL_A_PSE_PRIO,
__ETHTOOL_A_PSE_CNT,
ETHTOOL_A_PSE_MAX = (__ETHTOOL_A_PSE_CNT - 1)

View File

@ -111,6 +111,9 @@ static int pse_reply_size(const struct ethnl_req_info *req_base,
len += st->c33_pw_limit_nb_ranges *
(nla_total_size(0) +
nla_total_size(sizeof(u32)) * 2);
if (st->prio_max)
/* _PSE_PRIO_MAX + _PSE_PRIO */
len += nla_total_size(sizeof(u32)) * 2;
return len;
}
@ -205,6 +208,11 @@ static int pse_fill_reply(struct sk_buff *skb,
pse_put_pw_limit_ranges(skb, st))
return -EMSGSIZE;
if (st->prio_max &&
(nla_put_u32(skb, ETHTOOL_A_PSE_PRIO_MAX, st->prio_max) ||
nla_put_u32(skb, ETHTOOL_A_PSE_PRIO, st->prio)))
return -EMSGSIZE;
return 0;
}
@ -226,6 +234,7 @@ const struct nla_policy ethnl_pse_set_policy[ETHTOOL_A_PSE_MAX + 1] = {
NLA_POLICY_RANGE(NLA_U32, ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED,
ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED),
[ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT] = { .type = NLA_U32 },
[ETHTOOL_A_PSE_PRIO] = { .type = NLA_U32 },
};
static int
@ -274,6 +283,15 @@ ethnl_set_pse(struct ethnl_req_info *req_info, struct genl_info *info)
if (ret)
return ret;
if (tb[ETHTOOL_A_PSE_PRIO]) {
unsigned int prio;
prio = nla_get_u32(tb[ETHTOOL_A_PSE_PRIO]);
ret = pse_ethtool_set_prio(phydev->psec, info->extack, prio);
if (ret)
return ret;
}
if (tb[ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT]) {
unsigned int pw_limit;