bnxt_en: Implement ethtool .set_tunable() for ETHTOOL_PFC_PREVENTION_TOUT

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>
This commit is contained in:
Michael Chan 2025-09-16 21:08:39 -07:00 committed by Paolo Abeni
parent 6684b91d04
commit fa18932afb
2 changed files with 44 additions and 1 deletions

View 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;
}

View 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;