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 */
20 #endif /* EFSYS_OPT_SIENA */
22 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
23 static const efx_proxy_ops_t __efx_proxy_ef10_ops = {
24 ef10_proxy_auth_init, /* epo_init */
25 ef10_proxy_auth_fini, /* epo_fini */
26 ef10_proxy_auth_mc_config, /* epo_mc_config */
27 ef10_proxy_auth_disable, /* epo_disable */
28 ef10_proxy_auth_privilege_modify, /* epo_privilege_modify */
30 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
32 __checkReturn efx_rc_t
36 const efx_proxy_ops_t *epop;
39 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
40 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
41 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROXY));
43 switch (enp->en_family) {
45 case EFX_FAMILY_SIENA:
46 epop = &__efx_proxy_dummy_ops;
48 #endif /* EFSYS_OPT_SIENA */
50 #if EFSYS_OPT_HUNTINGTON
51 case EFX_FAMILY_HUNTINGTON:
52 epop = &__efx_proxy_ef10_ops;
54 #endif /* EFSYS_OPT_HUNTINGTON */
57 case EFX_FAMILY_MEDFORD:
58 epop = &__efx_proxy_ef10_ops;
60 #endif /* EFSYS_OPT_MEDFORD */
62 #if EFSYS_OPT_MEDFORD2
63 case EFX_FAMILY_MEDFORD2:
64 epop = &__efx_proxy_ef10_ops;
66 #endif /* EFSYS_OPT_MEDFORD2 */
74 if (epop->epo_init == NULL) {
79 if ((rc = epop->epo_init(enp)) != 0)
83 enp->en_mod_flags |= EFX_MOD_PROXY;
91 EFSYS_PROBE1(fail1, efx_rc_t, rc);
100 const efx_proxy_ops_t *epop = enp->en_epop;
102 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
103 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
104 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
106 if ((epop != NULL) && (epop->epo_fini != NULL))
110 enp->en_mod_flags &= ~EFX_MOD_PROXY;
113 __checkReturn efx_rc_t
114 efx_proxy_auth_configure(
116 __in efx_proxy_auth_config_t *configp)
118 const efx_proxy_ops_t *epop = enp->en_epop;
121 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
123 if ((configp == NULL) ||
124 (configp->request_bufferp == NULL) ||
125 (configp->response_bufferp == NULL) ||
126 (configp->status_bufferp == NULL) ||
127 (configp->op_listp == NULL) ||
128 (configp->block_cnt == 0)) {
133 if ((epop->epo_mc_config == NULL) ||
134 (epop->epo_privilege_modify == NULL)) {
139 rc = epop->epo_mc_config(enp, configp->request_bufferp,
140 configp->response_bufferp, configp->status_bufferp,
141 configp->block_cnt, configp->op_listp,
146 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
147 0, 0, 0, configp->handled_privileges);
160 EFSYS_PROBE1(fail1, efx_rc_t, rc);
164 __checkReturn efx_rc_t
165 efx_proxy_auth_destroy(
167 __in uint32_t handled_privileges)
169 const efx_proxy_ops_t *epop = enp->en_epop;
172 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
174 if ((epop->epo_disable == NULL) ||
175 (epop->epo_privilege_modify == NULL)) {
180 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
181 0, 0, handled_privileges, 0);
185 rc = epop->epo_disable(enp);
196 EFSYS_PROBE1(fail1, efx_rc_t, rc);
200 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */