Commit eeb0c8f7 authored by Kory Maincent (Dent Project)'s avatar Kory Maincent (Dent Project) Committed by Jakub Kicinski
Browse files

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: default avatarKory Maincent (Dent Project) <kory.maincent@bootlin.com>
Reviewed-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Link: https://patch.msgid.link/20250617-feature_poe_port_prio-v14-8-78a1a645e2ee@bootlin.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent ffef61d6
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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.
+26 −0
Original line number Diff line number Diff line
@@ -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
=======

+2 −0
Original line number Diff line number Diff line
@@ -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)
+18 −0
Original line number Diff line number Diff line
@@ -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;