From 63fa4a6afceec29d92841a4aa4e0d8d4bd49f7c8 Mon Sep 17 00:00:00 2001 From: Andrew Rybchenko Date: Tue, 1 Dec 2015 15:26:46 +0000 Subject: [PATCH] sfxge: support MAC spoofing for 4.2.x firmare Common code should infer other privileges from Admin privilege to support firmware that pre-dates introduction of specific privilege flags. Submitted by: Richard Houldsworth Sponsored by: Solarflare Communications, Inc. MFC after: 2 days Differential Revision: https://reviews.freebsd.org/D4327 --- sys/dev/sfxge/common/hunt_mcdi.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sys/dev/sfxge/common/hunt_mcdi.c b/sys/dev/sfxge/common/hunt_mcdi.c index 0c15a7fe9feb..03f5f27f161e 100644 --- a/sys/dev/sfxge/common/hunt_mcdi.c +++ b/sys/dev/sfxge/common/hunt_mcdi.c @@ -435,7 +435,11 @@ hunt_mcdi_fw_update_supported( EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_HUNTINGTON); - /* use privilege mask state at MCDI attach */ + /* + * Use privilege mask state at MCDI attach. + * Admin privilege must be used prior to introduction of + * specific flag. + */ *supportedp = (encp->enc_privilege_mask & MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN) == MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN; @@ -449,13 +453,20 @@ hunt_mcdi_macaddr_change_supported( __out boolean_t *supportedp) { efx_nic_cfg_t *encp = &(enp->en_nic_cfg); + uint32_t privilege_mask = encp->enc_privilege_mask; EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_HUNTINGTON); - /* use privilege mask state at MCDI attach */ - *supportedp = (encp->enc_privilege_mask & - MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING) - == MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING; + /* + * Use privilege mask state at MCDI attach. + * Admin privilege must be used prior to introduction of + * specific flag (at v4.6). + */ + *supportedp = + ((privilege_mask & MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING) == + MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING) || + ((privilege_mask & MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN) == + MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN); return (0); }