]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bnxt_en: Implement ethtool .set_tunable() for ETHTOOL_PFC_PREVENTION_TOUT
authorMichael Chan <michael.chan@broadcom.com>
Wed, 17 Sep 2025 04:08:39 +0000 (21:08 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 18 Sep 2025 11:09:43 +0000 (13:09 +0200)
Support the setting of the tunable if it is supported by firmware.
The supported range is 0 to the maximum msec value reported by
firmware.  PFC_STORM_PREVENTION_AUTO is also supported and 0 means it
is disabled.

Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250917040839.1924698-11-michael.chan@broadcom.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
include/linux/bnxt/hsi.h

index d94a8a2bf0f9e3a8be6f16e97aaca50752f85848..be32ef8f5c9698d7f1eb0c30dd009488fc3d47ff 100644 (file)
@@ -4416,12 +4416,25 @@ static int bnxt_hwrm_pfcwd_qcfg(struct bnxt *bp, u16 *val)
        return rc;
 }
 
+static int bnxt_hwrm_pfcwd_cfg(struct bnxt *bp, u16 val)
+{
+       struct hwrm_queue_pfcwd_timeout_cfg_input *req;
+       int rc;
+
+       rc = hwrm_req_init(bp, req, HWRM_QUEUE_PFCWD_TIMEOUT_CFG);
+       if (rc)
+               return rc;
+       req->pfcwd_timeout_value = cpu_to_le16(val);
+       rc = hwrm_req_send(bp, req);
+       return rc;
+}
+
 static int bnxt_set_tunable(struct net_device *dev,
                            const struct ethtool_tunable *tuna,
                            const void *data)
 {
        struct bnxt *bp = netdev_priv(dev);
-       u32 rx_copybreak;
+       u32 rx_copybreak, val;
 
        switch (tuna->id) {
        case ETHTOOL_RX_COPYBREAK:
@@ -4434,6 +4447,15 @@ static int bnxt_set_tunable(struct net_device *dev,
                        bp->rx_copybreak = rx_copybreak;
                }
                return 0;
+       case ETHTOOL_PFC_PREVENTION_TOUT:
+               if (BNXT_VF(bp) || !bp->max_pfcwd_tmo_ms)
+                       return -EOPNOTSUPP;
+
+               val = *(u16 *)data;
+               if (val > bp->max_pfcwd_tmo_ms &&
+                   val != PFC_STORM_PREVENTION_AUTO)
+                       return -EINVAL;
+               return bnxt_hwrm_pfcwd_cfg(bp, val);
        default:
                return -EOPNOTSUPP;
        }
index 23e7b1290a92edba28af75ecb789b68ac28ec650..47c34990cf234d163e08b6324c7b0563876e10c4 100644 (file)
@@ -6771,6 +6771,27 @@ struct hwrm_queue_pfcwd_timeout_qcaps_output {
        u8      valid;
 };
 
+/* hwrm_queue_pfcwd_timeout_cfg_input (size:192b/24B) */
+struct hwrm_queue_pfcwd_timeout_cfg_input {
+       __le16  req_type;
+       __le16  cmpl_ring;
+       __le16  seq_id;
+       __le16  target_id;
+       __le64  resp_addr;
+       __le16  pfcwd_timeout_value;
+       u8      unused_0[6];
+};
+
+/* hwrm_queue_pfcwd_timeout_cfg_output (size:128b/16B) */
+struct hwrm_queue_pfcwd_timeout_cfg_output {
+       __le16  error_code;
+       __le16  req_type;
+       __le16  seq_id;
+       __le16  resp_len;
+       u8      unused_0[7];
+       u8      valid;
+};
+
 /* hwrm_queue_pfcwd_timeout_qcfg_input (size:128b/16B) */
 struct hwrm_queue_pfcwd_timeout_qcfg_input {
        __le16  req_type;