1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2019-2021 Xilinx, Inc.
4 * Copyright(c) 2018-2019 Solarflare Communications Inc.
10 #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER
13 static const efx_proxy_ops_t __efx_proxy_dummy_ops = {
16 NULL, /* epo_mc_config */
17 NULL, /* epo_disable */
18 NULL, /* epo_privilege_modify */
19 NULL, /* epo_set_privilege_mask */
20 NULL, /* epo_complete_request */
21 NULL, /* epo_exec_cmd */
22 NULL, /* epo_get_privilege_mask */
24 #endif /* EFSYS_OPT_SIENA */
27 static const efx_proxy_ops_t __efx_proxy_ef10_ops = {
28 ef10_proxy_auth_init, /* epo_init */
29 ef10_proxy_auth_fini, /* epo_fini */
30 ef10_proxy_auth_mc_config, /* epo_mc_config */
31 ef10_proxy_auth_disable, /* epo_disable */
32 ef10_proxy_auth_privilege_modify, /* epo_privilege_modify */
33 ef10_proxy_auth_set_privilege_mask, /* epo_set_privilege_mask */
34 ef10_proxy_auth_complete_request, /* epo_complete_request */
35 ef10_proxy_auth_exec_cmd, /* epo_exec_cmd */
36 ef10_proxy_auth_get_privilege_mask, /* epo_get_privilege_mask */
38 #endif /* EFX_OPTS_EF10() */
40 __checkReturn efx_rc_t
44 const efx_proxy_ops_t *epop;
47 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
48 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
49 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROXY));
51 switch (enp->en_family) {
53 case EFX_FAMILY_SIENA:
54 epop = &__efx_proxy_dummy_ops;
56 #endif /* EFSYS_OPT_SIENA */
58 #if EFSYS_OPT_HUNTINGTON
59 case EFX_FAMILY_HUNTINGTON:
60 epop = &__efx_proxy_ef10_ops;
62 #endif /* EFSYS_OPT_HUNTINGTON */
65 case EFX_FAMILY_MEDFORD:
66 epop = &__efx_proxy_ef10_ops;
68 #endif /* EFSYS_OPT_MEDFORD */
70 #if EFSYS_OPT_MEDFORD2
71 case EFX_FAMILY_MEDFORD2:
72 epop = &__efx_proxy_ef10_ops;
74 #endif /* EFSYS_OPT_MEDFORD2 */
82 if (epop->epo_init == NULL) {
87 if ((rc = epop->epo_init(enp)) != 0)
91 enp->en_mod_flags |= EFX_MOD_PROXY;
99 EFSYS_PROBE1(fail1, efx_rc_t, rc);
108 const efx_proxy_ops_t *epop = enp->en_epop;
110 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
111 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
112 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
114 if ((epop != NULL) && (epop->epo_fini != NULL))
118 enp->en_mod_flags &= ~EFX_MOD_PROXY;
121 __checkReturn efx_rc_t
122 efx_proxy_auth_configure(
124 __in efx_proxy_auth_config_t *configp)
126 const efx_proxy_ops_t *epop = enp->en_epop;
129 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
131 if ((configp == NULL) ||
132 (configp->request_bufferp == NULL) ||
133 (configp->response_bufferp == NULL) ||
134 (configp->status_bufferp == NULL) ||
135 (configp->op_listp == NULL) ||
136 (configp->block_cnt == 0)) {
141 if ((epop->epo_mc_config == NULL) ||
142 (epop->epo_privilege_modify == NULL)) {
147 rc = epop->epo_mc_config(enp, configp->request_bufferp,
148 configp->response_bufferp, configp->status_bufferp,
149 configp->block_cnt, configp->op_listp,
154 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
155 0, 0, 0, configp->handled_privileges);
168 EFSYS_PROBE1(fail1, efx_rc_t, rc);
172 __checkReturn efx_rc_t
173 efx_proxy_auth_destroy(
175 __in uint32_t handled_privileges)
177 const efx_proxy_ops_t *epop = enp->en_epop;
180 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
182 if ((epop->epo_disable == NULL) ||
183 (epop->epo_privilege_modify == NULL)) {
188 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
189 0, 0, handled_privileges, 0);
193 rc = epop->epo_disable(enp);
204 EFSYS_PROBE1(fail1, efx_rc_t, rc);
208 __checkReturn efx_rc_t
209 efx_proxy_auth_complete_request(
211 __in uint32_t fn_index,
212 __in uint32_t proxy_result,
213 __in uint32_t handle)
215 const efx_proxy_ops_t *epop = enp->en_epop;
218 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
220 if (epop->epo_complete_request == NULL) {
225 rc = epop->epo_complete_request(enp, fn_index, proxy_result, handle);
233 EFSYS_PROBE1(fail1, efx_rc_t, rc);
237 __checkReturn efx_rc_t
238 efx_proxy_auth_exec_cmd(
240 __inout efx_proxy_cmd_params_t *paramsp)
242 const efx_proxy_ops_t *epop = enp->en_epop;
245 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
247 if (paramsp == NULL) {
252 if (epop->epo_exec_cmd == NULL) {
257 rc = epop->epo_exec_cmd(enp, paramsp);
267 EFSYS_PROBE1(fail1, efx_rc_t, rc);
271 __checkReturn efx_rc_t
272 efx_proxy_auth_set_privilege_mask(
274 __in uint32_t vf_index,
278 const efx_proxy_ops_t *epop = enp->en_epop;
281 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
283 if (epop->epo_set_privilege_mask == NULL) {
288 rc = epop->epo_set_privilege_mask(enp, vf_index, mask, value);
297 EFSYS_PROBE1(fail1, efx_rc_t, rc);
301 __checkReturn efx_rc_t
302 efx_proxy_auth_privilege_mask_get(
304 __in uint32_t pf_index,
305 __in uint32_t vf_index,
306 __out uint32_t *maskp)
308 const efx_proxy_ops_t *epop = enp->en_epop;
311 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
313 if (epop->epo_get_privilege_mask == NULL) {
318 rc = epop->epo_get_privilege_mask(enp, pf_index, vf_index, maskp);
327 EFSYS_PROBE1(fail1, efx_rc_t, rc);
331 __checkReturn efx_rc_t
332 efx_proxy_auth_privilege_modify(
334 __in uint32_t pf_index,
335 __in uint32_t vf_index,
336 __in uint32_t add_privileges_mask,
337 __in uint32_t remove_privileges_mask)
339 const efx_proxy_ops_t *epop = enp->en_epop;
342 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
344 if (epop->epo_privilege_modify == NULL) {
349 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ONE,
350 pf_index, vf_index, add_privileges_mask,
351 remove_privileges_mask);
360 EFSYS_PROBE1(fail1, efx_rc_t, rc);
364 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */