Commit fac5472f authored by Michael Chan's avatar Michael Chan Committed by Jakub Kicinski
Browse files

bnxt_en: Do not allow ethtool -m on an untrusted VF



Block all ethtool module operations on an untrusted VF.  The firmware
won't allow it and will return error.

Reviewed-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: default avatarPavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20241217182620.2454075-3-michael.chan@broadcom.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b1b66ae0
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -8279,16 +8279,20 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
	if (rc)
		goto func_qcfg_exit;

	flags = le16_to_cpu(resp->flags);
#ifdef CONFIG_BNXT_SRIOV
	if (BNXT_VF(bp)) {
		struct bnxt_vf_info *vf = &bp->vf;

		vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
		if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF)
			vf->flags |= BNXT_VF_TRUST;
		else
			vf->flags &= ~BNXT_VF_TRUST;
	} else {
		bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs);
	}
#endif
	flags = le16_to_cpu(resp->flags);
	if (flags & (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED |
		     FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED)) {
		bp->fw_cap |= BNXT_FW_CAP_LLDP_AGENT;
+5 −0
Original line number Diff line number Diff line
@@ -2270,6 +2270,11 @@ struct bnxt {

#define BNXT_PF(bp)		(!((bp)->flags & BNXT_FLAG_VF))
#define BNXT_VF(bp)		((bp)->flags & BNXT_FLAG_VF)
#ifdef CONFIG_BNXT_SRIOV
#define	BNXT_VF_IS_TRUSTED(bp)	((bp)->vf.flags & BNXT_VF_TRUST)
#else
#define	BNXT_VF_IS_TRUSTED(bp)	0
#endif
#define BNXT_NPAR(bp)		((bp)->port_partition_type)
#define BNXT_MH(bp)		((bp)->flags & BNXT_FLAG_MULTI_HOST)
#define BNXT_SINGLE_PF(bp)	(BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp))
+12 −0
Original line number Diff line number Diff line
@@ -4375,6 +4375,9 @@ static int bnxt_get_module_info(struct net_device *dev,
	struct bnxt *bp = netdev_priv(dev);
	int rc;

	if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
		return -EPERM;

	/* No point in going further if phy status indicates
	 * module is not inserted or if it is powered down or
	 * if it is of type 10GBase-T
@@ -4426,6 +4429,9 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
	u16  start = eeprom->offset, length = eeprom->len;
	int rc = 0;

	if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
		return -EPERM;

	memset(data, 0, eeprom->len);

	/* Read A0 portion of the EEPROM */
@@ -4480,6 +4486,12 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev,
	struct bnxt *bp = netdev_priv(dev);
	int rc;

	if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) {
		NL_SET_ERR_MSG_MOD(extack,
				   "Module read not permitted on untrusted VF");
		return -EPERM;
	}

	rc = bnxt_get_module_status(bp, extack);
	if (rc)
		return rc;