1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606 *
3*2d9fd380Sjfb8856606 * Copyright(c) 2019-2020 Xilinx, Inc.
4*2d9fd380Sjfb8856606 * Copyright(c) 2018-2019 Solarflare Communications Inc.
5*2d9fd380Sjfb8856606 */
6*2d9fd380Sjfb8856606
7*2d9fd380Sjfb8856606 #include "efx.h"
8*2d9fd380Sjfb8856606 #include "efx_impl.h"
9*2d9fd380Sjfb8856606
10*2d9fd380Sjfb8856606 #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER
11*2d9fd380Sjfb8856606
12*2d9fd380Sjfb8856606 #if EFSYS_OPT_SIENA
13*2d9fd380Sjfb8856606 static const efx_proxy_ops_t __efx_proxy_dummy_ops = {
14*2d9fd380Sjfb8856606 NULL, /* epo_init */
15*2d9fd380Sjfb8856606 NULL, /* epo_fini */
16*2d9fd380Sjfb8856606 NULL, /* epo_mc_config */
17*2d9fd380Sjfb8856606 NULL, /* epo_disable */
18*2d9fd380Sjfb8856606 NULL, /* epo_privilege_modify */
19*2d9fd380Sjfb8856606 NULL, /* epo_set_privilege_mask */
20*2d9fd380Sjfb8856606 NULL, /* epo_complete_request */
21*2d9fd380Sjfb8856606 NULL, /* epo_exec_cmd */
22*2d9fd380Sjfb8856606 NULL, /* epo_get_privilege_mask */
23*2d9fd380Sjfb8856606 };
24*2d9fd380Sjfb8856606 #endif /* EFSYS_OPT_SIENA */
25*2d9fd380Sjfb8856606
26*2d9fd380Sjfb8856606 #if EFX_OPTS_EF10()
27*2d9fd380Sjfb8856606 static const efx_proxy_ops_t __efx_proxy_ef10_ops = {
28*2d9fd380Sjfb8856606 ef10_proxy_auth_init, /* epo_init */
29*2d9fd380Sjfb8856606 ef10_proxy_auth_fini, /* epo_fini */
30*2d9fd380Sjfb8856606 ef10_proxy_auth_mc_config, /* epo_mc_config */
31*2d9fd380Sjfb8856606 ef10_proxy_auth_disable, /* epo_disable */
32*2d9fd380Sjfb8856606 ef10_proxy_auth_privilege_modify, /* epo_privilege_modify */
33*2d9fd380Sjfb8856606 ef10_proxy_auth_set_privilege_mask, /* epo_set_privilege_mask */
34*2d9fd380Sjfb8856606 ef10_proxy_auth_complete_request, /* epo_complete_request */
35*2d9fd380Sjfb8856606 ef10_proxy_auth_exec_cmd, /* epo_exec_cmd */
36*2d9fd380Sjfb8856606 ef10_proxy_auth_get_privilege_mask, /* epo_get_privilege_mask */
37*2d9fd380Sjfb8856606 };
38*2d9fd380Sjfb8856606 #endif /* EFX_OPTS_EF10() */
39*2d9fd380Sjfb8856606
40*2d9fd380Sjfb8856606 __checkReturn efx_rc_t
efx_proxy_auth_init(__in efx_nic_t * enp)41*2d9fd380Sjfb8856606 efx_proxy_auth_init(
42*2d9fd380Sjfb8856606 __in efx_nic_t *enp)
43*2d9fd380Sjfb8856606 {
44*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop;
45*2d9fd380Sjfb8856606 efx_rc_t rc;
46*2d9fd380Sjfb8856606
47*2d9fd380Sjfb8856606 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
48*2d9fd380Sjfb8856606 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
49*2d9fd380Sjfb8856606 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_PROXY));
50*2d9fd380Sjfb8856606
51*2d9fd380Sjfb8856606 switch (enp->en_family) {
52*2d9fd380Sjfb8856606 #if EFSYS_OPT_SIENA
53*2d9fd380Sjfb8856606 case EFX_FAMILY_SIENA:
54*2d9fd380Sjfb8856606 epop = &__efx_proxy_dummy_ops;
55*2d9fd380Sjfb8856606 break;
56*2d9fd380Sjfb8856606 #endif /* EFSYS_OPT_SIENA */
57*2d9fd380Sjfb8856606
58*2d9fd380Sjfb8856606 #if EFSYS_OPT_HUNTINGTON
59*2d9fd380Sjfb8856606 case EFX_FAMILY_HUNTINGTON:
60*2d9fd380Sjfb8856606 epop = &__efx_proxy_ef10_ops;
61*2d9fd380Sjfb8856606 break;
62*2d9fd380Sjfb8856606 #endif /* EFSYS_OPT_HUNTINGTON */
63*2d9fd380Sjfb8856606
64*2d9fd380Sjfb8856606 #if EFSYS_OPT_MEDFORD
65*2d9fd380Sjfb8856606 case EFX_FAMILY_MEDFORD:
66*2d9fd380Sjfb8856606 epop = &__efx_proxy_ef10_ops;
67*2d9fd380Sjfb8856606 break;
68*2d9fd380Sjfb8856606 #endif /* EFSYS_OPT_MEDFORD */
69*2d9fd380Sjfb8856606
70*2d9fd380Sjfb8856606 #if EFSYS_OPT_MEDFORD2
71*2d9fd380Sjfb8856606 case EFX_FAMILY_MEDFORD2:
72*2d9fd380Sjfb8856606 epop = &__efx_proxy_ef10_ops;
73*2d9fd380Sjfb8856606 break;
74*2d9fd380Sjfb8856606 #endif /* EFSYS_OPT_MEDFORD2 */
75*2d9fd380Sjfb8856606
76*2d9fd380Sjfb8856606 default:
77*2d9fd380Sjfb8856606 EFSYS_ASSERT(0);
78*2d9fd380Sjfb8856606 rc = ENOTSUP;
79*2d9fd380Sjfb8856606 goto fail1;
80*2d9fd380Sjfb8856606 }
81*2d9fd380Sjfb8856606
82*2d9fd380Sjfb8856606 if (epop->epo_init == NULL) {
83*2d9fd380Sjfb8856606 rc = ENOTSUP;
84*2d9fd380Sjfb8856606 goto fail2;
85*2d9fd380Sjfb8856606 }
86*2d9fd380Sjfb8856606
87*2d9fd380Sjfb8856606 if ((rc = epop->epo_init(enp)) != 0)
88*2d9fd380Sjfb8856606 goto fail3;
89*2d9fd380Sjfb8856606
90*2d9fd380Sjfb8856606 enp->en_epop = epop;
91*2d9fd380Sjfb8856606 enp->en_mod_flags |= EFX_MOD_PROXY;
92*2d9fd380Sjfb8856606 return (0);
93*2d9fd380Sjfb8856606
94*2d9fd380Sjfb8856606 fail3:
95*2d9fd380Sjfb8856606 EFSYS_PROBE(fail3);
96*2d9fd380Sjfb8856606 fail2:
97*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
98*2d9fd380Sjfb8856606 fail1:
99*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
100*2d9fd380Sjfb8856606
101*2d9fd380Sjfb8856606 return (rc);
102*2d9fd380Sjfb8856606 }
103*2d9fd380Sjfb8856606
104*2d9fd380Sjfb8856606 void
efx_proxy_auth_fini(__in efx_nic_t * enp)105*2d9fd380Sjfb8856606 efx_proxy_auth_fini(
106*2d9fd380Sjfb8856606 __in efx_nic_t *enp)
107*2d9fd380Sjfb8856606 {
108*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
109*2d9fd380Sjfb8856606
110*2d9fd380Sjfb8856606 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
111*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
112*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
113*2d9fd380Sjfb8856606
114*2d9fd380Sjfb8856606 if ((epop != NULL) && (epop->epo_fini != NULL))
115*2d9fd380Sjfb8856606 epop->epo_fini(enp);
116*2d9fd380Sjfb8856606
117*2d9fd380Sjfb8856606 enp->en_epop = NULL;
118*2d9fd380Sjfb8856606 enp->en_mod_flags &= ~EFX_MOD_PROXY;
119*2d9fd380Sjfb8856606 }
120*2d9fd380Sjfb8856606
121*2d9fd380Sjfb8856606 __checkReturn efx_rc_t
efx_proxy_auth_configure(__in efx_nic_t * enp,__in efx_proxy_auth_config_t * configp)122*2d9fd380Sjfb8856606 efx_proxy_auth_configure(
123*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
124*2d9fd380Sjfb8856606 __in efx_proxy_auth_config_t *configp)
125*2d9fd380Sjfb8856606 {
126*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
127*2d9fd380Sjfb8856606 efx_rc_t rc;
128*2d9fd380Sjfb8856606
129*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
130*2d9fd380Sjfb8856606
131*2d9fd380Sjfb8856606 if ((configp == NULL) ||
132*2d9fd380Sjfb8856606 (configp->request_bufferp == NULL) ||
133*2d9fd380Sjfb8856606 (configp->response_bufferp == NULL) ||
134*2d9fd380Sjfb8856606 (configp->status_bufferp == NULL) ||
135*2d9fd380Sjfb8856606 (configp->op_listp == NULL) ||
136*2d9fd380Sjfb8856606 (configp->block_cnt == 0)) {
137*2d9fd380Sjfb8856606 rc = EINVAL;
138*2d9fd380Sjfb8856606 goto fail1;
139*2d9fd380Sjfb8856606 }
140*2d9fd380Sjfb8856606
141*2d9fd380Sjfb8856606 if ((epop->epo_mc_config == NULL) ||
142*2d9fd380Sjfb8856606 (epop->epo_privilege_modify == NULL)) {
143*2d9fd380Sjfb8856606 rc = ENOTSUP;
144*2d9fd380Sjfb8856606 goto fail2;
145*2d9fd380Sjfb8856606 }
146*2d9fd380Sjfb8856606
147*2d9fd380Sjfb8856606 rc = epop->epo_mc_config(enp, configp->request_bufferp,
148*2d9fd380Sjfb8856606 configp->response_bufferp, configp->status_bufferp,
149*2d9fd380Sjfb8856606 configp->block_cnt, configp->op_listp,
150*2d9fd380Sjfb8856606 configp->op_count);
151*2d9fd380Sjfb8856606 if (rc != 0)
152*2d9fd380Sjfb8856606 goto fail3;
153*2d9fd380Sjfb8856606
154*2d9fd380Sjfb8856606 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
155*2d9fd380Sjfb8856606 0, 0, 0, configp->handled_privileges);
156*2d9fd380Sjfb8856606 if (rc != 0)
157*2d9fd380Sjfb8856606 goto fail4;
158*2d9fd380Sjfb8856606
159*2d9fd380Sjfb8856606 return (0);
160*2d9fd380Sjfb8856606
161*2d9fd380Sjfb8856606 fail4:
162*2d9fd380Sjfb8856606 EFSYS_PROBE(fail4);
163*2d9fd380Sjfb8856606 fail3:
164*2d9fd380Sjfb8856606 EFSYS_PROBE(fail3);
165*2d9fd380Sjfb8856606 fail2:
166*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
167*2d9fd380Sjfb8856606 fail1:
168*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
169*2d9fd380Sjfb8856606 return (rc);
170*2d9fd380Sjfb8856606 }
171*2d9fd380Sjfb8856606
172*2d9fd380Sjfb8856606 __checkReturn efx_rc_t
efx_proxy_auth_destroy(__in efx_nic_t * enp,__in uint32_t handled_privileges)173*2d9fd380Sjfb8856606 efx_proxy_auth_destroy(
174*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
175*2d9fd380Sjfb8856606 __in uint32_t handled_privileges)
176*2d9fd380Sjfb8856606 {
177*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
178*2d9fd380Sjfb8856606 efx_rc_t rc;
179*2d9fd380Sjfb8856606
180*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
181*2d9fd380Sjfb8856606
182*2d9fd380Sjfb8856606 if ((epop->epo_disable == NULL) ||
183*2d9fd380Sjfb8856606 (epop->epo_privilege_modify == NULL)) {
184*2d9fd380Sjfb8856606 rc = ENOTSUP;
185*2d9fd380Sjfb8856606 goto fail1;
186*2d9fd380Sjfb8856606 }
187*2d9fd380Sjfb8856606
188*2d9fd380Sjfb8856606 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
189*2d9fd380Sjfb8856606 0, 0, handled_privileges, 0);
190*2d9fd380Sjfb8856606 if (rc != 0)
191*2d9fd380Sjfb8856606 goto fail2;
192*2d9fd380Sjfb8856606
193*2d9fd380Sjfb8856606 rc = epop->epo_disable(enp);
194*2d9fd380Sjfb8856606 if (rc != 0)
195*2d9fd380Sjfb8856606 goto fail3;
196*2d9fd380Sjfb8856606
197*2d9fd380Sjfb8856606 return (0);
198*2d9fd380Sjfb8856606
199*2d9fd380Sjfb8856606 fail3:
200*2d9fd380Sjfb8856606 EFSYS_PROBE(fail3);
201*2d9fd380Sjfb8856606 fail2:
202*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
203*2d9fd380Sjfb8856606 fail1:
204*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
205*2d9fd380Sjfb8856606 return (rc);
206*2d9fd380Sjfb8856606 }
207*2d9fd380Sjfb8856606
208*2d9fd380Sjfb8856606 __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)209*2d9fd380Sjfb8856606 efx_proxy_auth_complete_request(
210*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
211*2d9fd380Sjfb8856606 __in uint32_t fn_index,
212*2d9fd380Sjfb8856606 __in uint32_t proxy_result,
213*2d9fd380Sjfb8856606 __in uint32_t handle)
214*2d9fd380Sjfb8856606 {
215*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
216*2d9fd380Sjfb8856606 efx_rc_t rc;
217*2d9fd380Sjfb8856606
218*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
219*2d9fd380Sjfb8856606
220*2d9fd380Sjfb8856606 if (epop->epo_complete_request == NULL) {
221*2d9fd380Sjfb8856606 rc = ENOTSUP;
222*2d9fd380Sjfb8856606 goto fail1;
223*2d9fd380Sjfb8856606 }
224*2d9fd380Sjfb8856606
225*2d9fd380Sjfb8856606 rc = epop->epo_complete_request(enp, fn_index, proxy_result, handle);
226*2d9fd380Sjfb8856606 if (rc != 0)
227*2d9fd380Sjfb8856606 goto fail2;
228*2d9fd380Sjfb8856606
229*2d9fd380Sjfb8856606 return (0);
230*2d9fd380Sjfb8856606 fail2:
231*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
232*2d9fd380Sjfb8856606 fail1:
233*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
234*2d9fd380Sjfb8856606 return (rc);
235*2d9fd380Sjfb8856606 }
236*2d9fd380Sjfb8856606
237*2d9fd380Sjfb8856606 __checkReturn efx_rc_t
efx_proxy_auth_exec_cmd(__in efx_nic_t * enp,__inout efx_proxy_cmd_params_t * paramsp)238*2d9fd380Sjfb8856606 efx_proxy_auth_exec_cmd(
239*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
240*2d9fd380Sjfb8856606 __inout efx_proxy_cmd_params_t *paramsp)
241*2d9fd380Sjfb8856606 {
242*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
243*2d9fd380Sjfb8856606 efx_rc_t rc;
244*2d9fd380Sjfb8856606
245*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
246*2d9fd380Sjfb8856606
247*2d9fd380Sjfb8856606 if (paramsp == NULL) {
248*2d9fd380Sjfb8856606 rc = EINVAL;
249*2d9fd380Sjfb8856606 goto fail1;
250*2d9fd380Sjfb8856606 }
251*2d9fd380Sjfb8856606
252*2d9fd380Sjfb8856606 if (epop->epo_exec_cmd == NULL) {
253*2d9fd380Sjfb8856606 rc = ENOTSUP;
254*2d9fd380Sjfb8856606 goto fail2;
255*2d9fd380Sjfb8856606 }
256*2d9fd380Sjfb8856606
257*2d9fd380Sjfb8856606 rc = epop->epo_exec_cmd(enp, paramsp);
258*2d9fd380Sjfb8856606 if (rc != 0)
259*2d9fd380Sjfb8856606 goto fail3;
260*2d9fd380Sjfb8856606
261*2d9fd380Sjfb8856606 return (0);
262*2d9fd380Sjfb8856606 fail3:
263*2d9fd380Sjfb8856606 EFSYS_PROBE(fail3);
264*2d9fd380Sjfb8856606 fail2:
265*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
266*2d9fd380Sjfb8856606 fail1:
267*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
268*2d9fd380Sjfb8856606 return (rc);
269*2d9fd380Sjfb8856606 }
270*2d9fd380Sjfb8856606
271*2d9fd380Sjfb8856606 __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)272*2d9fd380Sjfb8856606 efx_proxy_auth_set_privilege_mask(
273*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
274*2d9fd380Sjfb8856606 __in uint32_t vf_index,
275*2d9fd380Sjfb8856606 __in uint32_t mask,
276*2d9fd380Sjfb8856606 __in uint32_t value)
277*2d9fd380Sjfb8856606 {
278*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
279*2d9fd380Sjfb8856606 efx_rc_t rc;
280*2d9fd380Sjfb8856606
281*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
282*2d9fd380Sjfb8856606
283*2d9fd380Sjfb8856606 if (epop->epo_set_privilege_mask == NULL) {
284*2d9fd380Sjfb8856606 rc = ENOTSUP;
285*2d9fd380Sjfb8856606 goto fail1;
286*2d9fd380Sjfb8856606 }
287*2d9fd380Sjfb8856606
288*2d9fd380Sjfb8856606 rc = epop->epo_set_privilege_mask(enp, vf_index, mask, value);
289*2d9fd380Sjfb8856606 if (rc != 0)
290*2d9fd380Sjfb8856606 goto fail2;
291*2d9fd380Sjfb8856606
292*2d9fd380Sjfb8856606 return (0);
293*2d9fd380Sjfb8856606
294*2d9fd380Sjfb8856606 fail2:
295*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
296*2d9fd380Sjfb8856606 fail1:
297*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
298*2d9fd380Sjfb8856606 return (rc);
299*2d9fd380Sjfb8856606 }
300*2d9fd380Sjfb8856606
301*2d9fd380Sjfb8856606 __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)302*2d9fd380Sjfb8856606 efx_proxy_auth_privilege_mask_get(
303*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
304*2d9fd380Sjfb8856606 __in uint32_t pf_index,
305*2d9fd380Sjfb8856606 __in uint32_t vf_index,
306*2d9fd380Sjfb8856606 __out uint32_t *maskp)
307*2d9fd380Sjfb8856606 {
308*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
309*2d9fd380Sjfb8856606 efx_rc_t rc;
310*2d9fd380Sjfb8856606
311*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
312*2d9fd380Sjfb8856606
313*2d9fd380Sjfb8856606 if (epop->epo_get_privilege_mask == NULL) {
314*2d9fd380Sjfb8856606 rc = ENOTSUP;
315*2d9fd380Sjfb8856606 goto fail1;
316*2d9fd380Sjfb8856606 }
317*2d9fd380Sjfb8856606
318*2d9fd380Sjfb8856606 rc = epop->epo_get_privilege_mask(enp, pf_index, vf_index, maskp);
319*2d9fd380Sjfb8856606 if (rc != 0)
320*2d9fd380Sjfb8856606 goto fail2;
321*2d9fd380Sjfb8856606
322*2d9fd380Sjfb8856606 return (0);
323*2d9fd380Sjfb8856606
324*2d9fd380Sjfb8856606 fail2:
325*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
326*2d9fd380Sjfb8856606 fail1:
327*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
328*2d9fd380Sjfb8856606 return (rc);
329*2d9fd380Sjfb8856606 }
330*2d9fd380Sjfb8856606
331*2d9fd380Sjfb8856606 __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)332*2d9fd380Sjfb8856606 efx_proxy_auth_privilege_modify(
333*2d9fd380Sjfb8856606 __in efx_nic_t *enp,
334*2d9fd380Sjfb8856606 __in uint32_t pf_index,
335*2d9fd380Sjfb8856606 __in uint32_t vf_index,
336*2d9fd380Sjfb8856606 __in uint32_t add_privileges_mask,
337*2d9fd380Sjfb8856606 __in uint32_t remove_privileges_mask)
338*2d9fd380Sjfb8856606 {
339*2d9fd380Sjfb8856606 const efx_proxy_ops_t *epop = enp->en_epop;
340*2d9fd380Sjfb8856606 efx_rc_t rc;
341*2d9fd380Sjfb8856606
342*2d9fd380Sjfb8856606 EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
343*2d9fd380Sjfb8856606
344*2d9fd380Sjfb8856606 if (epop->epo_privilege_modify == NULL) {
345*2d9fd380Sjfb8856606 rc = ENOTSUP;
346*2d9fd380Sjfb8856606 goto fail1;
347*2d9fd380Sjfb8856606 }
348*2d9fd380Sjfb8856606
349*2d9fd380Sjfb8856606 rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ONE,
350*2d9fd380Sjfb8856606 pf_index, vf_index, add_privileges_mask,
351*2d9fd380Sjfb8856606 remove_privileges_mask);
352*2d9fd380Sjfb8856606 if (rc != 0)
353*2d9fd380Sjfb8856606 goto fail2;
354*2d9fd380Sjfb8856606
355*2d9fd380Sjfb8856606 return (0);
356*2d9fd380Sjfb8856606
357*2d9fd380Sjfb8856606 fail2:
358*2d9fd380Sjfb8856606 EFSYS_PROBE(fail2);
359*2d9fd380Sjfb8856606 fail1:
360*2d9fd380Sjfb8856606 EFSYS_PROBE1(fail1, efx_rc_t, rc);
361*2d9fd380Sjfb8856606 return (rc);
362*2d9fd380Sjfb8856606 }
363*2d9fd380Sjfb8856606
364*2d9fd380Sjfb8856606 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */
365