xref: /dpdk/drivers/common/sfc_efx/base/efx_proxy.c (revision 672386c1e9e1f64f7aa3b1360ad22dc737ea8d72)
15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
25e111ed8SAndrew Rybchenko  *
3*672386c1SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
45e111ed8SAndrew Rybchenko  * Copyright(c) 2018-2019 Solarflare Communications Inc.
55e111ed8SAndrew Rybchenko  */
65e111ed8SAndrew Rybchenko 
75e111ed8SAndrew Rybchenko #include "efx.h"
85e111ed8SAndrew Rybchenko #include "efx_impl.h"
95e111ed8SAndrew Rybchenko 
105e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER
115e111ed8SAndrew Rybchenko 
125e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
135e111ed8SAndrew Rybchenko static const efx_proxy_ops_t	__efx_proxy_dummy_ops = {
145e111ed8SAndrew Rybchenko 	NULL,			/* epo_init */
155e111ed8SAndrew Rybchenko 	NULL,			/* epo_fini */
165e111ed8SAndrew Rybchenko 	NULL,			/* epo_mc_config */
175e111ed8SAndrew Rybchenko 	NULL,			/* epo_disable */
185e111ed8SAndrew Rybchenko 	NULL,			/* epo_privilege_modify */
195e111ed8SAndrew Rybchenko 	NULL,			/* epo_set_privilege_mask */
205e111ed8SAndrew Rybchenko 	NULL,			/* epo_complete_request */
215e111ed8SAndrew Rybchenko 	NULL,			/* epo_exec_cmd */
225e111ed8SAndrew Rybchenko 	NULL,			/* epo_get_privilege_mask */
235e111ed8SAndrew Rybchenko };
245e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */
255e111ed8SAndrew Rybchenko 
265e111ed8SAndrew Rybchenko #if EFX_OPTS_EF10()
275e111ed8SAndrew Rybchenko static const efx_proxy_ops_t			__efx_proxy_ef10_ops = {
285e111ed8SAndrew Rybchenko 	ef10_proxy_auth_init,			/* epo_init */
295e111ed8SAndrew Rybchenko 	ef10_proxy_auth_fini,			/* epo_fini */
305e111ed8SAndrew Rybchenko 	ef10_proxy_auth_mc_config,		/* epo_mc_config */
315e111ed8SAndrew Rybchenko 	ef10_proxy_auth_disable,		/* epo_disable */
325e111ed8SAndrew Rybchenko 	ef10_proxy_auth_privilege_modify,	/* epo_privilege_modify */
335e111ed8SAndrew Rybchenko 	ef10_proxy_auth_set_privilege_mask,	/* epo_set_privilege_mask */
345e111ed8SAndrew Rybchenko 	ef10_proxy_auth_complete_request,	/* epo_complete_request */
355e111ed8SAndrew Rybchenko 	ef10_proxy_auth_exec_cmd,		/* epo_exec_cmd */
365e111ed8SAndrew Rybchenko 	ef10_proxy_auth_get_privilege_mask,	/* epo_get_privilege_mask */
375e111ed8SAndrew Rybchenko };
385e111ed8SAndrew Rybchenko #endif /* EFX_OPTS_EF10() */
395e111ed8SAndrew Rybchenko 
405e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_init(__in efx_nic_t * enp)415e111ed8SAndrew Rybchenko efx_proxy_auth_init(
425e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
435e111ed8SAndrew Rybchenko {
445e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop;
455e111ed8SAndrew Rybchenko 	efx_rc_t rc;
465e111ed8SAndrew Rybchenko 
475e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
485e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
495e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROXY));
505e111ed8SAndrew Rybchenko 
515e111ed8SAndrew Rybchenko 	switch (enp->en_family) {
525e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
535e111ed8SAndrew Rybchenko 	case EFX_FAMILY_SIENA:
545e111ed8SAndrew Rybchenko 		epop = &__efx_proxy_dummy_ops;
555e111ed8SAndrew Rybchenko 		break;
565e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */
575e111ed8SAndrew Rybchenko 
585e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON
595e111ed8SAndrew Rybchenko 	case EFX_FAMILY_HUNTINGTON:
605e111ed8SAndrew Rybchenko 		epop = &__efx_proxy_ef10_ops;
615e111ed8SAndrew Rybchenko 		break;
625e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_HUNTINGTON */
635e111ed8SAndrew Rybchenko 
645e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD
655e111ed8SAndrew Rybchenko 	case EFX_FAMILY_MEDFORD:
665e111ed8SAndrew Rybchenko 		epop = &__efx_proxy_ef10_ops;
675e111ed8SAndrew Rybchenko 		break;
685e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MEDFORD */
695e111ed8SAndrew Rybchenko 
705e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD2
715e111ed8SAndrew Rybchenko 	case EFX_FAMILY_MEDFORD2:
725e111ed8SAndrew Rybchenko 		epop = &__efx_proxy_ef10_ops;
735e111ed8SAndrew Rybchenko 		break;
745e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MEDFORD2 */
755e111ed8SAndrew Rybchenko 
765e111ed8SAndrew Rybchenko 	default:
775e111ed8SAndrew Rybchenko 		EFSYS_ASSERT(0);
785e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
795e111ed8SAndrew Rybchenko 		goto fail1;
805e111ed8SAndrew Rybchenko 	}
815e111ed8SAndrew Rybchenko 
825e111ed8SAndrew Rybchenko 	if (epop->epo_init == NULL) {
835e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
845e111ed8SAndrew Rybchenko 		goto fail2;
855e111ed8SAndrew Rybchenko 	}
865e111ed8SAndrew Rybchenko 
875e111ed8SAndrew Rybchenko 	if ((rc = epop->epo_init(enp)) != 0)
885e111ed8SAndrew Rybchenko 		goto fail3;
895e111ed8SAndrew Rybchenko 
905e111ed8SAndrew Rybchenko 	enp->en_epop = epop;
915e111ed8SAndrew Rybchenko 	enp->en_mod_flags |= EFX_MOD_PROXY;
925e111ed8SAndrew Rybchenko 	return (0);
935e111ed8SAndrew Rybchenko 
945e111ed8SAndrew Rybchenko fail3:
955e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail3);
965e111ed8SAndrew Rybchenko fail2:
975e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
985e111ed8SAndrew Rybchenko fail1:
995e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
1005e111ed8SAndrew Rybchenko 
1015e111ed8SAndrew Rybchenko 	return (rc);
1025e111ed8SAndrew Rybchenko }
1035e111ed8SAndrew Rybchenko 
1045e111ed8SAndrew Rybchenko 			void
efx_proxy_auth_fini(__in efx_nic_t * enp)1055e111ed8SAndrew Rybchenko efx_proxy_auth_fini(
1065e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp)
1075e111ed8SAndrew Rybchenko {
1085e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
1095e111ed8SAndrew Rybchenko 
1105e111ed8SAndrew Rybchenko 	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
1115e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
1125e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
1135e111ed8SAndrew Rybchenko 
1145e111ed8SAndrew Rybchenko 	if ((epop != NULL) && (epop->epo_fini != NULL))
1155e111ed8SAndrew Rybchenko 		epop->epo_fini(enp);
1165e111ed8SAndrew Rybchenko 
1175e111ed8SAndrew Rybchenko 	enp->en_epop = NULL;
1185e111ed8SAndrew Rybchenko 	enp->en_mod_flags &= ~EFX_MOD_PROXY;
1195e111ed8SAndrew Rybchenko }
1205e111ed8SAndrew Rybchenko 
1215e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_configure(__in efx_nic_t * enp,__in efx_proxy_auth_config_t * configp)1225e111ed8SAndrew Rybchenko efx_proxy_auth_configure(
1235e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1245e111ed8SAndrew Rybchenko 	__in		efx_proxy_auth_config_t *configp)
1255e111ed8SAndrew Rybchenko {
1265e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
1275e111ed8SAndrew Rybchenko 	efx_rc_t rc;
1285e111ed8SAndrew Rybchenko 
1295e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
1305e111ed8SAndrew Rybchenko 
1315e111ed8SAndrew Rybchenko 	if ((configp == NULL) ||
1325e111ed8SAndrew Rybchenko 	    (configp->request_bufferp == NULL) ||
1335e111ed8SAndrew Rybchenko 	    (configp->response_bufferp == NULL) ||
1345e111ed8SAndrew Rybchenko 	    (configp->status_bufferp == NULL) ||
1355e111ed8SAndrew Rybchenko 	    (configp->op_listp == NULL) ||
1365e111ed8SAndrew Rybchenko 	    (configp->block_cnt == 0)) {
1375e111ed8SAndrew Rybchenko 		rc = EINVAL;
1385e111ed8SAndrew Rybchenko 		goto fail1;
1395e111ed8SAndrew Rybchenko 	}
1405e111ed8SAndrew Rybchenko 
1415e111ed8SAndrew Rybchenko 	if ((epop->epo_mc_config == NULL) ||
1425e111ed8SAndrew Rybchenko 	    (epop->epo_privilege_modify == NULL)) {
1435e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
1445e111ed8SAndrew Rybchenko 		goto fail2;
1455e111ed8SAndrew Rybchenko 	}
1465e111ed8SAndrew Rybchenko 
1475e111ed8SAndrew Rybchenko 	rc = epop->epo_mc_config(enp, configp->request_bufferp,
1485e111ed8SAndrew Rybchenko 			configp->response_bufferp, configp->status_bufferp,
1495e111ed8SAndrew Rybchenko 			configp->block_cnt, configp->op_listp,
1505e111ed8SAndrew Rybchenko 			configp->op_count);
1515e111ed8SAndrew Rybchenko 	if (rc != 0)
1525e111ed8SAndrew Rybchenko 		goto fail3;
1535e111ed8SAndrew Rybchenko 
1545e111ed8SAndrew Rybchenko 	rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
1555e111ed8SAndrew Rybchenko 			0, 0, 0, configp->handled_privileges);
1565e111ed8SAndrew Rybchenko 	if (rc != 0)
1575e111ed8SAndrew Rybchenko 		goto fail4;
1585e111ed8SAndrew Rybchenko 
1595e111ed8SAndrew Rybchenko 	return (0);
1605e111ed8SAndrew Rybchenko 
1615e111ed8SAndrew Rybchenko fail4:
1625e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail4);
1635e111ed8SAndrew Rybchenko fail3:
1645e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail3);
1655e111ed8SAndrew Rybchenko fail2:
1665e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
1675e111ed8SAndrew Rybchenko fail1:
1685e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
1695e111ed8SAndrew Rybchenko 	return (rc);
1705e111ed8SAndrew Rybchenko }
1715e111ed8SAndrew Rybchenko 
1725e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_destroy(__in efx_nic_t * enp,__in uint32_t handled_privileges)1735e111ed8SAndrew Rybchenko efx_proxy_auth_destroy(
1745e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1755e111ed8SAndrew Rybchenko 	__in		uint32_t handled_privileges)
1765e111ed8SAndrew Rybchenko {
1775e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
1785e111ed8SAndrew Rybchenko 	efx_rc_t rc;
1795e111ed8SAndrew Rybchenko 
1805e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
1815e111ed8SAndrew Rybchenko 
1825e111ed8SAndrew Rybchenko 	if ((epop->epo_disable == NULL) ||
1835e111ed8SAndrew Rybchenko 	    (epop->epo_privilege_modify == NULL)) {
1845e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
1855e111ed8SAndrew Rybchenko 		goto fail1;
1865e111ed8SAndrew Rybchenko 	}
1875e111ed8SAndrew Rybchenko 
1885e111ed8SAndrew Rybchenko 	rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
1895e111ed8SAndrew Rybchenko 		0, 0, handled_privileges, 0);
1905e111ed8SAndrew Rybchenko 	if (rc != 0)
1915e111ed8SAndrew Rybchenko 		goto fail2;
1925e111ed8SAndrew Rybchenko 
1935e111ed8SAndrew Rybchenko 	rc = epop->epo_disable(enp);
1945e111ed8SAndrew Rybchenko 	if (rc != 0)
1955e111ed8SAndrew Rybchenko 		goto fail3;
1965e111ed8SAndrew Rybchenko 
1975e111ed8SAndrew Rybchenko 	return (0);
1985e111ed8SAndrew Rybchenko 
1995e111ed8SAndrew Rybchenko fail3:
2005e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail3);
2015e111ed8SAndrew Rybchenko fail2:
2025e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
2035e111ed8SAndrew Rybchenko fail1:
2045e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
2055e111ed8SAndrew Rybchenko 	return (rc);
2065e111ed8SAndrew Rybchenko }
2075e111ed8SAndrew Rybchenko 
2085e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_complete_request(__in efx_nic_t * enp,__in uint32_t fn_index,__in uint32_t proxy_result,__in uint32_t handle)2095e111ed8SAndrew Rybchenko efx_proxy_auth_complete_request(
2105e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2115e111ed8SAndrew Rybchenko 	__in		uint32_t fn_index,
2125e111ed8SAndrew Rybchenko 	__in		uint32_t proxy_result,
2135e111ed8SAndrew Rybchenko 	__in		uint32_t handle)
2145e111ed8SAndrew Rybchenko {
2155e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
2165e111ed8SAndrew Rybchenko 	efx_rc_t rc;
2175e111ed8SAndrew Rybchenko 
2185e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
2195e111ed8SAndrew Rybchenko 
2205e111ed8SAndrew Rybchenko 	if (epop->epo_complete_request == NULL) {
2215e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
2225e111ed8SAndrew Rybchenko 		goto fail1;
2235e111ed8SAndrew Rybchenko 	}
2245e111ed8SAndrew Rybchenko 
2255e111ed8SAndrew Rybchenko 	rc = epop->epo_complete_request(enp, fn_index, proxy_result, handle);
2265e111ed8SAndrew Rybchenko 	if (rc != 0)
2275e111ed8SAndrew Rybchenko 		goto fail2;
2285e111ed8SAndrew Rybchenko 
2295e111ed8SAndrew Rybchenko 	return (0);
2305e111ed8SAndrew Rybchenko fail2:
2315e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
2325e111ed8SAndrew Rybchenko fail1:
2335e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
2345e111ed8SAndrew Rybchenko 	return (rc);
2355e111ed8SAndrew Rybchenko }
2365e111ed8SAndrew Rybchenko 
2375e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_exec_cmd(__in efx_nic_t * enp,__inout efx_proxy_cmd_params_t * paramsp)2385e111ed8SAndrew Rybchenko efx_proxy_auth_exec_cmd(
2395e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2405e111ed8SAndrew Rybchenko 	__inout		efx_proxy_cmd_params_t *paramsp)
2415e111ed8SAndrew Rybchenko {
2425e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
2435e111ed8SAndrew Rybchenko 	efx_rc_t rc;
2445e111ed8SAndrew Rybchenko 
2455e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
2465e111ed8SAndrew Rybchenko 
2475e111ed8SAndrew Rybchenko 	if (paramsp == NULL) {
2485e111ed8SAndrew Rybchenko 		rc = EINVAL;
2495e111ed8SAndrew Rybchenko 		goto fail1;
2505e111ed8SAndrew Rybchenko 	}
2515e111ed8SAndrew Rybchenko 
2525e111ed8SAndrew Rybchenko 	if (epop->epo_exec_cmd == NULL) {
2535e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
2545e111ed8SAndrew Rybchenko 		goto fail2;
2555e111ed8SAndrew Rybchenko 	}
2565e111ed8SAndrew Rybchenko 
2575e111ed8SAndrew Rybchenko 	rc = epop->epo_exec_cmd(enp, paramsp);
2585e111ed8SAndrew Rybchenko 	if (rc != 0)
2595e111ed8SAndrew Rybchenko 		goto fail3;
2605e111ed8SAndrew Rybchenko 
2615e111ed8SAndrew Rybchenko 	return (0);
2625e111ed8SAndrew Rybchenko fail3:
2635e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail3);
2645e111ed8SAndrew Rybchenko fail2:
2655e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
2665e111ed8SAndrew Rybchenko fail1:
2675e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
2685e111ed8SAndrew Rybchenko 	return (rc);
2695e111ed8SAndrew Rybchenko }
2705e111ed8SAndrew Rybchenko 
2715e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_set_privilege_mask(__in efx_nic_t * enp,__in uint32_t vf_index,__in uint32_t mask,__in uint32_t value)2725e111ed8SAndrew Rybchenko efx_proxy_auth_set_privilege_mask(
2735e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2745e111ed8SAndrew Rybchenko 	__in		uint32_t vf_index,
2755e111ed8SAndrew Rybchenko 	__in		uint32_t mask,
2765e111ed8SAndrew Rybchenko 	__in		uint32_t value)
2775e111ed8SAndrew Rybchenko {
2785e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
2795e111ed8SAndrew Rybchenko 	efx_rc_t rc;
2805e111ed8SAndrew Rybchenko 
2815e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
2825e111ed8SAndrew Rybchenko 
2835e111ed8SAndrew Rybchenko 	if (epop->epo_set_privilege_mask == NULL) {
2845e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
2855e111ed8SAndrew Rybchenko 		goto fail1;
2865e111ed8SAndrew Rybchenko 	}
2875e111ed8SAndrew Rybchenko 
2885e111ed8SAndrew Rybchenko 	rc = epop->epo_set_privilege_mask(enp, vf_index, mask, value);
2895e111ed8SAndrew Rybchenko 	if (rc != 0)
2905e111ed8SAndrew Rybchenko 		goto fail2;
2915e111ed8SAndrew Rybchenko 
2925e111ed8SAndrew Rybchenko 	return (0);
2935e111ed8SAndrew Rybchenko 
2945e111ed8SAndrew Rybchenko fail2:
2955e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
2965e111ed8SAndrew Rybchenko fail1:
2975e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
2985e111ed8SAndrew Rybchenko 	return (rc);
2995e111ed8SAndrew Rybchenko }
3005e111ed8SAndrew Rybchenko 
3015e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_privilege_mask_get(__in efx_nic_t * enp,__in uint32_t pf_index,__in uint32_t vf_index,__out uint32_t * maskp)3025e111ed8SAndrew Rybchenko efx_proxy_auth_privilege_mask_get(
3035e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
3045e111ed8SAndrew Rybchenko 	__in		uint32_t pf_index,
3055e111ed8SAndrew Rybchenko 	__in		uint32_t vf_index,
3065e111ed8SAndrew Rybchenko 	__out		uint32_t *maskp)
3075e111ed8SAndrew Rybchenko {
3085e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
3095e111ed8SAndrew Rybchenko 	efx_rc_t rc;
3105e111ed8SAndrew Rybchenko 
3115e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
3125e111ed8SAndrew Rybchenko 
3135e111ed8SAndrew Rybchenko 	if (epop->epo_get_privilege_mask == NULL) {
3145e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
3155e111ed8SAndrew Rybchenko 		goto fail1;
3165e111ed8SAndrew Rybchenko 	}
3175e111ed8SAndrew Rybchenko 
3185e111ed8SAndrew Rybchenko 	rc = epop->epo_get_privilege_mask(enp, pf_index, vf_index, maskp);
3195e111ed8SAndrew Rybchenko 	if (rc != 0)
3205e111ed8SAndrew Rybchenko 		goto fail2;
3215e111ed8SAndrew Rybchenko 
3225e111ed8SAndrew Rybchenko 	return (0);
3235e111ed8SAndrew Rybchenko 
3245e111ed8SAndrew Rybchenko fail2:
3255e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
3265e111ed8SAndrew Rybchenko fail1:
3275e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
3285e111ed8SAndrew Rybchenko 	return (rc);
3295e111ed8SAndrew Rybchenko }
3305e111ed8SAndrew Rybchenko 
3315e111ed8SAndrew Rybchenko 	__checkReturn	efx_rc_t
efx_proxy_auth_privilege_modify(__in efx_nic_t * enp,__in uint32_t pf_index,__in uint32_t vf_index,__in uint32_t add_privileges_mask,__in uint32_t remove_privileges_mask)3325e111ed8SAndrew Rybchenko efx_proxy_auth_privilege_modify(
3335e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
3345e111ed8SAndrew Rybchenko 	__in		uint32_t pf_index,
3355e111ed8SAndrew Rybchenko 	__in		uint32_t vf_index,
3365e111ed8SAndrew Rybchenko 	__in		uint32_t add_privileges_mask,
3375e111ed8SAndrew Rybchenko 	__in		uint32_t remove_privileges_mask)
3385e111ed8SAndrew Rybchenko {
3395e111ed8SAndrew Rybchenko 	const efx_proxy_ops_t *epop = enp->en_epop;
3405e111ed8SAndrew Rybchenko 	efx_rc_t rc;
3415e111ed8SAndrew Rybchenko 
3425e111ed8SAndrew Rybchenko 	EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
3435e111ed8SAndrew Rybchenko 
3445e111ed8SAndrew Rybchenko 	if (epop->epo_privilege_modify == NULL) {
3455e111ed8SAndrew Rybchenko 		rc = ENOTSUP;
3465e111ed8SAndrew Rybchenko 		goto fail1;
3475e111ed8SAndrew Rybchenko 	}
3485e111ed8SAndrew Rybchenko 
3495e111ed8SAndrew Rybchenko 	rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ONE,
3505e111ed8SAndrew Rybchenko 		    pf_index, vf_index, add_privileges_mask,
3515e111ed8SAndrew Rybchenko 		    remove_privileges_mask);
3525e111ed8SAndrew Rybchenko 	if (rc != 0)
3535e111ed8SAndrew Rybchenko 		goto fail2;
3545e111ed8SAndrew Rybchenko 
3555e111ed8SAndrew Rybchenko 	return (0);
3565e111ed8SAndrew Rybchenko 
3575e111ed8SAndrew Rybchenko fail2:
3585e111ed8SAndrew Rybchenko 	EFSYS_PROBE(fail2);
3595e111ed8SAndrew Rybchenko fail1:
3605e111ed8SAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
3615e111ed8SAndrew Rybchenko 	return (rc);
3625e111ed8SAndrew Rybchenko }
3635e111ed8SAndrew Rybchenko 
3645e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */
365