net/sfc/base: support proxy auth operations for SR-IOV
[dpdk.git] / drivers / net / sfc / base / efx_proxy.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2018-2019 Solarflare Communications Inc.
4  * All rights reserved.
5  */
6
7 #include "efx.h"
8 #include "efx_impl.h"
9
10 #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER
11
12 #if EFSYS_OPT_SIENA
13 static const efx_proxy_ops_t    __efx_proxy_dummy_ops = {
14         NULL,                   /* epo_init */
15         NULL,                   /* epo_fini */
16         NULL,                   /* epo_mc_config */
17         NULL,                   /* epo_disable */
18         NULL,                   /* epo_privilege_modify */
19 };
20 #endif /* EFSYS_OPT_SIENA */
21
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 */
29 };
30 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
31
32         __checkReturn   efx_rc_t
33 efx_proxy_auth_init(
34         __in            efx_nic_t *enp)
35 {
36         const efx_proxy_ops_t *epop;
37         efx_rc_t rc;
38
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));
42
43         switch (enp->en_family) {
44 #if EFSYS_OPT_SIENA
45         case EFX_FAMILY_SIENA:
46                 epop = &__efx_proxy_dummy_ops;
47                 break;
48 #endif /* EFSYS_OPT_SIENA */
49
50 #if EFSYS_OPT_HUNTINGTON
51         case EFX_FAMILY_HUNTINGTON:
52                 epop = &__efx_proxy_ef10_ops;
53                 break;
54 #endif /* EFSYS_OPT_HUNTINGTON */
55
56 #if EFSYS_OPT_MEDFORD
57         case EFX_FAMILY_MEDFORD:
58                 epop = &__efx_proxy_ef10_ops;
59                 break;
60 #endif /* EFSYS_OPT_MEDFORD */
61
62 #if EFSYS_OPT_MEDFORD2
63         case EFX_FAMILY_MEDFORD2:
64                 epop = &__efx_proxy_ef10_ops;
65                 break;
66 #endif /* EFSYS_OPT_MEDFORD2 */
67
68         default:
69                 EFSYS_ASSERT(0);
70                 rc = ENOTSUP;
71                 goto fail1;
72         }
73
74         if (epop->epo_init == NULL) {
75                 rc = ENOTSUP;
76                 goto fail2;
77         }
78
79         if ((rc = epop->epo_init(enp)) != 0)
80                 goto fail3;
81
82         enp->en_epop = epop;
83         enp->en_mod_flags |= EFX_MOD_PROXY;
84         return (0);
85
86 fail3:
87         EFSYS_PROBE(fail3);
88 fail2:
89         EFSYS_PROBE(fail2);
90 fail1:
91         EFSYS_PROBE1(fail1, efx_rc_t, rc);
92
93         return (rc);
94 }
95
96                         void
97 efx_proxy_auth_fini(
98         __in            efx_nic_t *enp)
99 {
100         const efx_proxy_ops_t *epop = enp->en_epop;
101
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);
105
106         if ((epop != NULL) && (epop->epo_fini != NULL))
107                 epop->epo_fini(enp);
108
109         enp->en_epop = NULL;
110         enp->en_mod_flags &= ~EFX_MOD_PROXY;
111 }
112
113         __checkReturn   efx_rc_t
114 efx_proxy_auth_configure(
115         __in            efx_nic_t *enp,
116         __in            efx_proxy_auth_config_t *configp)
117 {
118         const efx_proxy_ops_t *epop = enp->en_epop;
119         efx_rc_t rc;
120
121         EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
122
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)) {
129                 rc = EINVAL;
130                 goto fail1;
131         }
132
133         if ((epop->epo_mc_config == NULL) ||
134             (epop->epo_privilege_modify == NULL)) {
135                 rc = ENOTSUP;
136                 goto fail2;
137         }
138
139         rc = epop->epo_mc_config(enp, configp->request_bufferp,
140                         configp->response_bufferp, configp->status_bufferp,
141                         configp->block_cnt, configp->op_listp,
142                         configp->op_count);
143         if (rc != 0)
144                 goto fail3;
145
146         rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
147                         0, 0, 0, configp->handled_privileges);
148         if (rc != 0)
149                 goto fail4;
150
151         return (0);
152
153 fail4:
154         EFSYS_PROBE(fail4);
155 fail3:
156         EFSYS_PROBE(fail3);
157 fail2:
158         EFSYS_PROBE(fail2);
159 fail1:
160         EFSYS_PROBE1(fail1, efx_rc_t, rc);
161         return (rc);
162 }
163
164         __checkReturn   efx_rc_t
165 efx_proxy_auth_destroy(
166         __in            efx_nic_t *enp,
167         __in            uint32_t handled_privileges)
168 {
169         const efx_proxy_ops_t *epop = enp->en_epop;
170         efx_rc_t rc;
171
172         EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROXY);
173
174         if ((epop->epo_disable == NULL) ||
175             (epop->epo_privilege_modify == NULL)) {
176                 rc = ENOTSUP;
177                 goto fail1;
178         }
179
180         rc = epop->epo_privilege_modify(enp, MC_CMD_PRIVILEGE_MODIFY_IN_ALL,
181                 0, 0, handled_privileges, 0);
182         if (rc != 0)
183                 goto fail2;
184
185         rc = epop->epo_disable(enp);
186         if (rc != 0)
187                 goto fail3;
188
189         return (0);
190
191 fail3:
192         EFSYS_PROBE(fail3);
193 fail2:
194         EFSYS_PROBE(fail2);
195 fail1:
196         EFSYS_PROBE1(fail1, efx_rc_t, rc);
197         return (rc);
198 }
199
200 #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */