Commit fa18932a authored by Michael Chan's avatar Michael Chan Committed by Paolo Abeni
Browse files

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: default avatarAndy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250917040839.1924698-11-michael.chan@broadcom.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 6684b91d
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -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;
	}
+21 −0
Original line number Diff line number Diff line
@@ -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;