]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ethtool: Add support for new power domains index description
authorKory Maincent (Dent Project) <kory.maincent@bootlin.com>
Tue, 17 Jun 2025 12:12:04 +0000 (14:12 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 19 Jun 2025 02:00:16 +0000 (19:00 -0700)
Report the index of the newly introduced PSE power domain to the user,
enabling improved management of the power budget for PSE devices.

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-5-78a1a645e2ee@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/netlink/specs/ethtool.yaml
Documentation/networking/ethtool-netlink.rst
drivers/net/pse-pd/pse_core.c
include/linux/pse-pd/pse.h
include/uapi/linux/ethtool_netlink_generated.h
net/ethtool/pse-pd.c

index 92b34a19f308f6633b3e28750cbfc116bb982d5b..dfd9b842a4e7989c25d07e4d01df676737b8362c 100644 (file)
@@ -1406,6 +1406,10 @@ attribute-sets:
         type: nest
         multi-attr: true
         nested-attributes: c33-pse-pw-limit
+      -
+        name: pse-pw-d-id
+        type: u32
+        name-prefix: ethtool-a-
   -
     name: rss
     attr-cnt-name: __ethtool-a-rss-cnt
@@ -2229,6 +2233,7 @@ operations:
             - c33-pse-ext-substate
             - c33-pse-avail-pw-limit
             - c33-pse-pw-limit-ranges
+            - pse-pw-d-id
       dump: *pse-get-op
     -
       name: pse-set
index 433737865bc2262bfcc736cb38349ba7ce4f4f96..e9af8e58564cfab17182a95f13b3898c368ab28d 100644 (file)
@@ -1789,6 +1789,7 @@ Kernel response contents:
                                                       limit of the PoE PSE.
   ``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
   ==========================================  ======  =============================
 
 When set, the optional ``ETHTOOL_A_PODL_PSE_ADMIN_STATE`` attribute identifies
@@ -1862,6 +1863,9 @@ identifies the C33 PSE power limit ranges through
 If the controller works with fixed classes, the min and max values will be
 equal.
 
+The ``ETHTOOL_A_PSE_PW_D_ID`` attribute identifies the index of PSE power
+domain.
+
 PSE_SET
 =======
 
index f2fb7ccbc4c21aeb781fe31a9a923246fe94954f..7d424c22225e25340f8a413f89f93773b1b11e54 100644 (file)
@@ -1098,6 +1098,9 @@ int pse_ethtool_get_status(struct pse_control *psec,
        pcdev = psec->pcdev;
        ops = pcdev->ops;
        mutex_lock(&pcdev->lock);
+       if (pcdev->pi[psec->id].pw_d)
+               status->pw_d_id = pcdev->pi[psec->id].pw_d->id;
+
        ret = ops->pi_get_admin_state(pcdev, psec->id, &admin_state);
        if (ret)
                goto out;
index f736b1677ea52ff28368e9df3237166946d9d9fe..2f8ecfd87d43751a88a063d75b0818a28a62d507 100644 (file)
@@ -114,6 +114,7 @@ struct pse_pw_limit_ranges {
 /**
  * struct ethtool_pse_control_status - PSE control/channel status.
  *
+ * @pw_d_id: PSE power domain index.
  * @podl_admin_state: operational state of the PoDL PSE
  *     functions. IEEE 802.3-2018 30.15.1.1.2 aPoDLPSEAdminState
  * @podl_pw_status: power detection status of the PoDL PSE.
@@ -135,6 +136,7 @@ struct pse_pw_limit_ranges {
  *     ranges
  */
 struct ethtool_pse_control_status {
+       u32 pw_d_id;
        enum ethtool_podl_pse_admin_state podl_admin_state;
        enum ethtool_podl_pse_pw_d_status podl_pw_status;
        enum ethtool_c33_pse_admin_state c33_admin_state;
index 3864aa0de8c72945c9774f2054d3f7387b1bfb26..ed344c8533eb744243d779caee234092a23fe510 100644 (file)
@@ -652,6 +652,7 @@ enum {
        ETHTOOL_A_C33_PSE_EXT_SUBSTATE,
        ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT,
        ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES,
+       ETHTOOL_A_PSE_PW_D_ID,
 
        __ETHTOOL_A_PSE_CNT,
        ETHTOOL_A_PSE_MAX = (__ETHTOOL_A_PSE_CNT - 1)
index 5443b4e0065ac6a3e54c0e55911347ce5b7e6e04..6a978a55959ef2a9a8ffdcfedd637c925c132fe0 100644 (file)
@@ -83,6 +83,8 @@ static int pse_reply_size(const struct ethnl_req_info *req_base,
        const struct ethtool_pse_control_status *st = &data->status;
        int len = 0;
 
+       if (st->pw_d_id)
+               len += nla_total_size(sizeof(u32)); /* _PSE_PW_D_ID */
        if (st->podl_admin_state > 0)
                len += nla_total_size(sizeof(u32)); /* _PODL_PSE_ADMIN_STATE */
        if (st->podl_pw_status > 0)
@@ -148,6 +150,11 @@ static int pse_fill_reply(struct sk_buff *skb,
        const struct pse_reply_data *data = PSE_REPDATA(reply_base);
        const struct ethtool_pse_control_status *st = &data->status;
 
+       if (st->pw_d_id &&
+           nla_put_u32(skb, ETHTOOL_A_PSE_PW_D_ID,
+                       st->pw_d_id))
+               return -EMSGSIZE;
+
        if (st->podl_admin_state > 0 &&
            nla_put_u32(skb, ETHTOOL_A_PODL_PSE_ADMIN_STATE,
                        st->podl_admin_state))