1 /* SPDX-License-Identifier: BSD-3-Clause
3 * 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 */
23 #endif /* EFSYS_OPT_SIENA */
25 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
26 static const efx_proxy_ops_t __efx_proxy_ef10_ops = {
27 ef10_proxy_auth_init, /* epo_init */
28 ef10_proxy_auth_fini, /* epo_fini */
29 ef10_proxy_auth_mc_config, /* epo_mc_config */
30 ef10_proxy_auth_disable, /* epo_disable */
31 ef10_proxy_auth_privilege_modify, /* epo_privilege_modify */
32 ef10_proxy_auth_set_privilege_mask, /* epo_set_privilege_mask */
33 ef10_proxy_auth_complete_request, /* epo_complete_request */
34 ef10_proxy_auth_exec_cmd, /* epo_exec_cmd */
36 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
38 __checkReturn efx_rc_t
42 const efx_proxy_ops_t *epop;
45 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
46 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
47 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROXY));
49 switch (enp->en_family) {
51 case EFX_FAMILY_SIENA:
52 epop = &__efx_proxy_dummy_ops;
54 #endif /* EFSYS_OPT_SIENA */
56 #if EFSYS_OPT_HUNTINGTON
57 case EFX_FAMILY_HUNTINGTON:
58 epop = &__efx_proxy_ef10_ops;
60 #endif /* EFSYS_OPT_HUNTINGTON */
63 case EFX_FAMILY_MEDFORD:
64 epop = &__efx_proxy_ef10_ops;
66 #endif /* EFSYS_OPT_MEDFORD */
68 #if EFSYS_OPT_MEDFORD2
69 case EFX_FAMILY_MEDFORD2:
70 epop = &__efx_proxy_ef10_ops;
72 #endif /* EFSYS_OPT_MEDFORD2 */
80 if (epop->epo_init == NULL) {
85 if ((rc = epop->epo_init(enp)) != 0)
89 enp->en_mod_flags |= EFX_MOD_PROXY;
97 EFSYS_PROBE1(fail1, efx_rc_t, rc);
106 const efx_proxy_ops_t *epop = enp->en_epop;
108 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
109 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
110 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
112 if ((epop != NULL) && (epop->epo_fini != NULL))
116 enp->en_mod_flags &= ~EFX_MOD_PROXY;
119 __checkReturn efx_rc_t
120 efx_proxy_auth_configure(
122 __in efx_proxy_auth_config_t *configp)
124 const efx_proxy_ops_t *epop = enp->en_epop;
127 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
129 if ((configp == NULL) ||
130 (configp->request_bufferp == NULL) ||
131 (configp->response_bufferp == NULL) ||
132 (configp->status_bufferp == NULL) ||
133 (configp->op_listp == NULL) ||
134 (configp->block_cnt == 0)) {
139 if ((epop->epo_mc_config == NULL) ||
140 (epop->epo_privilege_modify == NULL)) {
145 rc = epop->epo_mc_config(enp, configp->request_bufferp,
146 configp->response_bufferp, configp->status_bufferp,
147 configp->block_cnt, configp->op_listp,
152 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
153 0, 0, 0, configp->handled_privileges);
166 EFSYS_PROBE1(fail1, efx_rc_t, rc);
170 __checkReturn efx_rc_t
171 efx_proxy_auth_destroy(
173 __in uint32_t handled_privileges)
175 const efx_proxy_ops_t *epop = enp->en_epop;
178 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
180 if ((epop->epo_disable == NULL) ||
181 (epop->epo_privilege_modify == NULL)) {
186 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
187 0, 0, handled_privileges, 0);
191 rc = epop->epo_disable(enp);
202 EFSYS_PROBE1(fail1, efx_rc_t, rc);
206 __checkReturn efx_rc_t
207 efx_proxy_auth_complete_request(
209 __in uint32_t fn_index,
210 __in uint32_t proxy_result,
211 __in uint32_t handle)
213 const efx_proxy_ops_t *epop = enp->en_epop;
216 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
218 if (epop->epo_complete_request == NULL) {
223 rc = epop->epo_complete_request(enp, fn_index, proxy_result, handle);
231 EFSYS_PROBE1(fail1, efx_rc_t, rc);
235 __checkReturn efx_rc_t
236 efx_proxy_auth_exec_cmd(
238 __inout efx_proxy_cmd_params_t *paramsp)
240 const efx_proxy_ops_t *epop = enp->en_epop;
243 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
245 if (paramsp == NULL) {
250 if (epop->epo_exec_cmd == NULL) {
255 rc = epop->epo_exec_cmd(enp, paramsp);
265 EFSYS_PROBE1(fail1, efx_rc_t, rc);
269 __checkReturn efx_rc_t
270 efx_proxy_auth_set_privilege_mask(
272 __in uint32_t vf_index,
276 const efx_proxy_ops_t *epop = enp->en_epop;
279 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
281 if (epop->epo_set_privilege_mask == NULL) {
286 rc = epop->epo_set_privilege_mask(enp, vf_index, mask, value);
295 EFSYS_PROBE1(fail1, efx_rc_t, rc);
300 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */