xref: /dpdk/drivers/common/sfc_efx/base/ef10_evb.c (revision 672386c1e9e1f64f7aa3b1360ad22dc737ea8d72)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2021 Xilinx, Inc.
4  * Copyright(c) 2018-2019 Solarflare Communications Inc.
5  */
6 
7 #include "efx.h"
8 #include "efx_impl.h"
9 
10 #if EFSYS_OPT_EVB
11 
12 #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10()
13 
14 	__checkReturn	efx_rc_t
ef10_evb_init(__in efx_nic_t * enp)15 ef10_evb_init(
16 	__in		efx_nic_t *enp)
17 {
18 	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
19 
20 	return (0);
21 }
22 
23 	void
ef10_evb_fini(__in efx_nic_t * enp)24 ef10_evb_fini(
25 	__in		efx_nic_t *enp)
26 {
27 	EFSYS_ASSERT(EFX_FAMILY_IS_EF100(enp) || EFX_FAMILY_IS_EF10(enp));
28 }
29 
30 static	__checkReturn	efx_rc_t
efx_mcdi_vswitch_alloc(__in efx_nic_t * enp,__in efx_vport_id_t vport_id,__in efx_vswitch_type_t vswitch_type)31 efx_mcdi_vswitch_alloc(
32 	__in		efx_nic_t *enp,
33 	__in		efx_vport_id_t vport_id,
34 	__in		efx_vswitch_type_t vswitch_type)
35 {
36 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VSWITCH_ALLOC_IN_LEN,
37 		MC_CMD_VSWITCH_ALLOC_OUT_LEN);
38 	efx_mcdi_req_t req;
39 	efx_rc_t rc;
40 	uint8_t ntags;
41 
42 	/* Ensure EFX and MCDI use same values for vswitch types */
43 	EFX_STATIC_ASSERT(EFX_VSWITCH_TYPE_VLAN ==
44 		MC_CMD_VSWITCH_ALLOC_IN_VSWITCH_TYPE_VLAN);
45 	EFX_STATIC_ASSERT(EFX_VSWITCH_TYPE_VEB ==
46 		MC_CMD_VSWITCH_ALLOC_IN_VSWITCH_TYPE_VEB);
47 	EFX_STATIC_ASSERT(EFX_VSWITCH_TYPE_MUX ==
48 		MC_CMD_VSWITCH_ALLOC_IN_VSWITCH_TYPE_MUX);
49 
50 	/* First try with maximum number of VLAN tags FW supports */
51 	ntags = 2;
52 retry:
53 	req.emr_cmd = MC_CMD_VSWITCH_ALLOC;
54 	req.emr_in_buf = payload;
55 	req.emr_in_length = MC_CMD_VSWITCH_ALLOC_IN_LEN;
56 	req.emr_out_buf = payload;
57 	req.emr_out_length = MC_CMD_VSWITCH_ALLOC_OUT_LEN;
58 
59 	MCDI_IN_SET_DWORD(req, VSWITCH_ALLOC_IN_UPSTREAM_PORT_ID, vport_id);
60 	MCDI_IN_SET_DWORD(req, VSWITCH_ALLOC_IN_TYPE, vswitch_type);
61 	MCDI_IN_SET_DWORD(req, VSWITCH_ALLOC_IN_NUM_VLAN_TAGS, ntags);
62 	MCDI_IN_POPULATE_DWORD_1(req, VSWITCH_ALLOC_IN_FLAGS,
63 		VSWITCH_ALLOC_IN_FLAG_AUTO_PORT, 0);
64 
65 	efx_mcdi_execute(enp, &req);
66 
67 	if (req.emr_rc != 0) {
68 		rc = req.emr_rc;
69 		/*
70 		 * efx_rc_t error codes in libefx are translated from MCDI
71 		 * error codes in efx_mcdi_request_errcode. As this conversion
72 		 * is not a 1:1, here we check the specific MCDI error code.
73 		 */
74 		if (req.emr_err_code == MC_CMD_ERR_VLAN_LIMIT) {
75 			/* Too many VLAN tags, retry with fewer */
76 			EFSYS_PROBE(vlan_limit);
77 			ntags--;
78 			if (ntags > 0) {
79 				/*
80 				 * Zero the buffer before reusing it
81 				 * for another request
82 				 */
83 				memset(payload, 0, sizeof (payload));
84 				goto retry;
85 			}
86 			goto fail1;
87 		}
88 	}
89 
90 	return (0);
91 
92 fail1:
93 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
94 	return (rc);
95 }
96 
97 static	__checkReturn	efx_rc_t
efx_mcdi_vswitch_free(__in efx_nic_t * enp)98 efx_mcdi_vswitch_free(
99 	__in		efx_nic_t *enp)
100 {
101 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VSWITCH_FREE_IN_LEN,
102 		MC_CMD_VSWITCH_FREE_OUT_LEN);
103 	efx_mcdi_req_t req;
104 	efx_rc_t rc;
105 
106 	req.emr_cmd = MC_CMD_VSWITCH_FREE;
107 	req.emr_in_buf = payload;
108 	req.emr_in_length = MC_CMD_VSWITCH_FREE_IN_LEN;
109 	req.emr_out_buf = payload;
110 	req.emr_out_length = MC_CMD_VSWITCH_FREE_OUT_LEN;
111 
112 	MCDI_IN_SET_DWORD(req, VSWITCH_FREE_IN_UPSTREAM_PORT_ID,
113 		EVB_PORT_ID_ASSIGNED);
114 	efx_mcdi_execute(enp, &req);
115 
116 	if (req.emr_rc != 0) {
117 		rc = req.emr_rc;
118 		goto fail1;
119 	}
120 
121 	return (0);
122 
123 fail1:
124 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
125 	return (rc);
126 }
127 
128 static	__checkReturn	efx_rc_t
efx_mcdi_vport_alloc(__in efx_nic_t * enp,__in efx_vport_type_t vport_type,__in uint16_t vid,__in boolean_t vlan_restrict,__out efx_vport_id_t * vport_idp)129 efx_mcdi_vport_alloc(
130 	__in		efx_nic_t *enp,
131 	__in		efx_vport_type_t vport_type,
132 	__in		uint16_t vid,
133 	__in		boolean_t vlan_restrict,
134 	__out		efx_vport_id_t *vport_idp)
135 {
136 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VPORT_ALLOC_IN_LEN,
137 		MC_CMD_VPORT_ALLOC_OUT_LEN);
138 	efx_mcdi_req_t req;
139 	efx_rc_t rc;
140 
141 	/* Ensure EFX and MCDI use same values for vport types */
142 	EFX_STATIC_ASSERT(EFX_VPORT_TYPE_NORMAL ==
143 		MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL);
144 	EFX_STATIC_ASSERT(EFX_VPORT_TYPE_EXPANSION ==
145 		MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_EXPANSION);
146 	EFX_STATIC_ASSERT(EFX_VPORT_TYPE_TEST ==
147 		MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_TEST);
148 
149 	req.emr_cmd = MC_CMD_VPORT_ALLOC;
150 	req.emr_in_buf = payload;
151 	req.emr_in_length = MC_CMD_VPORT_ALLOC_IN_LEN;
152 	req.emr_out_buf = payload;
153 	req.emr_out_length = MC_CMD_VPORT_ALLOC_OUT_LEN;
154 
155 	MCDI_IN_SET_DWORD(req, VPORT_ALLOC_IN_UPSTREAM_PORT_ID,
156 		EVB_PORT_ID_ASSIGNED);
157 	MCDI_IN_SET_DWORD(req, VPORT_ALLOC_IN_TYPE, vport_type);
158 	MCDI_IN_SET_DWORD(req, VPORT_ALLOC_IN_NUM_VLAN_TAGS,
159 		(vid != EFX_FILTER_VID_UNSPEC));
160 
161 	MCDI_IN_POPULATE_DWORD_2(req, VPORT_ALLOC_IN_FLAGS,
162 		VPORT_ALLOC_IN_FLAG_AUTO_PORT, 0,
163 		VPORT_ALLOC_IN_FLAG_VLAN_RESTRICT, vlan_restrict);
164 
165 	if (vid != EFX_FILTER_VID_UNSPEC)
166 		MCDI_IN_POPULATE_DWORD_1(req, VPORT_ALLOC_IN_VLAN_TAGS,
167 			VPORT_ALLOC_IN_VLAN_TAG_0, vid);
168 
169 	efx_mcdi_execute(enp, &req);
170 
171 	if (req.emr_rc != 0) {
172 		rc = req.emr_rc;
173 		goto fail1;
174 	}
175 
176 	if (req.emr_out_length_used < MC_CMD_VPORT_ALLOC_OUT_LEN) {
177 		rc = EMSGSIZE;
178 		goto fail2;
179 	}
180 
181 	*vport_idp = *MCDI_OUT2(req, uint32_t, VPORT_ALLOC_OUT_VPORT_ID);
182 	return (0);
183 
184 fail2:
185 	EFSYS_PROBE(fail2);
186 fail1:
187 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
188 	return (rc);
189 }
190 
191 static	__checkReturn	efx_rc_t
efx_mcdi_vport_free(__in efx_nic_t * enp,__in efx_vport_id_t vport_id)192 efx_mcdi_vport_free(
193 	__in		efx_nic_t *enp,
194 	__in		efx_vport_id_t vport_id)
195 {
196 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VPORT_FREE_IN_LEN,
197 		MC_CMD_VPORT_FREE_OUT_LEN);
198 	efx_mcdi_req_t req;
199 	efx_rc_t rc;
200 
201 	req.emr_cmd = MC_CMD_VPORT_FREE;
202 	req.emr_in_buf = payload;
203 	req.emr_in_length = MC_CMD_VPORT_FREE_IN_LEN;
204 	req.emr_out_buf = payload;
205 	req.emr_out_length = MC_CMD_VPORT_FREE_OUT_LEN;
206 
207 	MCDI_IN_SET_DWORD(req, VPORT_FREE_IN_VPORT_ID, vport_id);
208 	efx_mcdi_execute(enp, &req);
209 
210 	if (req.emr_rc != 0) {
211 		rc = req.emr_rc;
212 		goto fail1;
213 	}
214 
215 	return (0);
216 
217 fail1:
218 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
219 	return (rc);
220 }
221 
222 static	__checkReturn			efx_rc_t
efx_mcdi_vport_mac_addr_add(__in efx_nic_t * enp,__in efx_vport_id_t vport_id,__in_bcount (EFX_MAC_ADDR_LEN)uint8_t * addrp)223 efx_mcdi_vport_mac_addr_add(
224 	__in				efx_nic_t *enp,
225 	__in				efx_vport_id_t vport_id,
226 	__in_bcount(EFX_MAC_ADDR_LEN)	uint8_t *addrp)
227 {
228 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VPORT_ADD_MAC_ADDRESS_IN_LEN,
229 		MC_CMD_VPORT_ADD_MAC_ADDRESS_OUT_LEN);
230 	efx_mcdi_req_t req;
231 	efx_rc_t rc;
232 
233 	req.emr_cmd = MC_CMD_VPORT_ADD_MAC_ADDRESS;
234 	req.emr_in_buf = payload;
235 	req.emr_in_length = MC_CMD_VPORT_ADD_MAC_ADDRESS_IN_LEN;
236 	req.emr_out_buf = payload;
237 	req.emr_out_length = MC_CMD_VPORT_ADD_MAC_ADDRESS_OUT_LEN;
238 
239 	MCDI_IN_SET_DWORD(req, VPORT_ADD_MAC_ADDRESS_IN_VPORT_ID, vport_id);
240 	EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t,
241 				VPORT_ADD_MAC_ADDRESS_IN_MACADDR), addrp);
242 
243 	efx_mcdi_execute(enp, &req);
244 
245 	if (req.emr_rc != 0) {
246 		rc = req.emr_rc;
247 		goto fail1;
248 	}
249 
250 	return (0);
251 
252 fail1:
253 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
254 	return (rc);
255 }
256 
257 static	__checkReturn			efx_rc_t
efx_mcdi_vport_mac_addr_del(__in efx_nic_t * enp,__in efx_vport_id_t vport_id,__in_bcount (EFX_MAC_ADDR_LEN)uint8_t * addrp)258 efx_mcdi_vport_mac_addr_del(
259 	__in				efx_nic_t *enp,
260 	__in				efx_vport_id_t vport_id,
261 	__in_bcount(EFX_MAC_ADDR_LEN)	uint8_t *addrp)
262 {
263 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN,
264 		MC_CMD_VPORT_DEL_MAC_ADDRESS_OUT_LEN);
265 	efx_mcdi_req_t req;
266 	efx_rc_t rc;
267 
268 	req.emr_cmd = MC_CMD_VPORT_DEL_MAC_ADDRESS;
269 	req.emr_in_buf = payload;
270 	req.emr_in_length = MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN;
271 	req.emr_out_buf = payload;
272 	req.emr_out_length = MC_CMD_VPORT_DEL_MAC_ADDRESS_OUT_LEN;
273 
274 	MCDI_IN_SET_DWORD(req, VPORT_DEL_MAC_ADDRESS_IN_VPORT_ID, vport_id);
275 	EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t,
276 				VPORT_DEL_MAC_ADDRESS_IN_MACADDR), addrp);
277 
278 	efx_mcdi_execute(enp, &req);
279 
280 	if (req.emr_rc != 0) {
281 		rc = req.emr_rc;
282 		goto fail1;
283 	}
284 
285 	return (0);
286 
287 fail1:
288 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
289 	return (rc);
290 }
291 
292 static	__checkReturn	efx_rc_t
efx_mcdi_port_assign(__in efx_nic_t * enp,__in efx_vport_id_t vport_id,__in uint32_t vf_index)293 efx_mcdi_port_assign(
294 	__in		efx_nic_t *enp,
295 	__in		efx_vport_id_t vport_id,
296 	__in		uint32_t vf_index)
297 {
298 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_EVB_PORT_ASSIGN_IN_LEN,
299 		MC_CMD_EVB_PORT_ASSIGN_OUT_LEN);
300 	efx_mcdi_req_t req;
301 	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
302 	efx_rc_t rc;
303 
304 	req.emr_cmd = MC_CMD_EVB_PORT_ASSIGN;
305 	req.emr_in_buf = payload;
306 	req.emr_in_length = MC_CMD_EVB_PORT_ASSIGN_IN_LEN;
307 	req.emr_out_buf = payload;
308 	req.emr_out_length = MC_CMD_EVB_PORT_ASSIGN_OUT_LEN;
309 
310 	MCDI_IN_SET_DWORD(req, EVB_PORT_ASSIGN_IN_PORT_ID, vport_id);
311 	MCDI_IN_POPULATE_DWORD_2(req, EVB_PORT_ASSIGN_IN_FUNCTION,
312 		EVB_PORT_ASSIGN_IN_PF, encp->enc_pf,
313 		EVB_PORT_ASSIGN_IN_VF, vf_index);
314 
315 	efx_mcdi_execute(enp, &req);
316 
317 	if (req.emr_rc != 0) {
318 		rc = req.emr_rc;
319 		goto fail1;
320 	}
321 
322 	return (0);
323 
324 fail1:
325 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
326 	return (rc);
327 }
328 
329 static	__checkReturn				efx_rc_t
efx_mcdi_vport_reconfigure(__in efx_nic_t * enp,__in efx_vport_id_t vport_id,__in_opt uint16_t * vidp,__in_bcount_opt (EFX_MAC_ADDR_LEN)uint8_t * addrp,__out_opt boolean_t * fn_resetp)330 efx_mcdi_vport_reconfigure(
331 	__in					efx_nic_t *enp,
332 	__in					efx_vport_id_t vport_id,
333 	__in_opt				uint16_t *vidp,
334 	__in_bcount_opt(EFX_MAC_ADDR_LEN)	uint8_t *addrp,
335 	__out_opt				boolean_t *fn_resetp)
336 {
337 	EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VPORT_RECONFIGURE_IN_LEN,
338 		MC_CMD_VPORT_RECONFIGURE_OUT_LEN);
339 	efx_mcdi_req_t req;
340 	efx_rc_t rc;
341 	uint32_t reset_flag = 0;
342 
343 	req.emr_cmd = MC_CMD_VPORT_RECONFIGURE;
344 	req.emr_in_buf = payload;
345 	req.emr_in_length = MC_CMD_VPORT_RECONFIGURE_IN_LEN;
346 	req.emr_out_buf = payload;
347 	req.emr_out_length = MC_CMD_VPORT_RECONFIGURE_OUT_LEN;
348 
349 	MCDI_IN_SET_DWORD(req, VPORT_RECONFIGURE_IN_VPORT_ID, vport_id);
350 
351 	if (vidp != NULL) {
352 		MCDI_IN_POPULATE_DWORD_1(req, VPORT_RECONFIGURE_IN_FLAGS,
353 			VPORT_RECONFIGURE_IN_REPLACE_VLAN_TAGS, 1);
354 		if (*vidp != EFX_FILTER_VID_UNSPEC) {
355 			MCDI_IN_SET_DWORD(req,
356 				VPORT_RECONFIGURE_IN_NUM_VLAN_TAGS, 1);
357 			MCDI_IN_POPULATE_DWORD_1(req,
358 				VPORT_RECONFIGURE_IN_VLAN_TAGS,
359 				VPORT_RECONFIGURE_IN_VLAN_TAG_0, *vidp);
360 		}
361 	}
362 
363 	if ((addrp != NULL) && (efx_is_zero_eth_addr(addrp) == B_FALSE)) {
364 		MCDI_IN_POPULATE_DWORD_1(req, VPORT_RECONFIGURE_IN_FLAGS,
365 			 VPORT_RECONFIGURE_IN_REPLACE_MACADDRS, 1);
366 		MCDI_IN_SET_DWORD(req, VPORT_RECONFIGURE_IN_NUM_MACADDRS, 1);
367 		EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t,
368 					VPORT_RECONFIGURE_IN_MACADDRS), addrp);
369 	}
370 
371 	efx_mcdi_execute(enp, &req);
372 	if (req.emr_rc != 0) {
373 		rc = req.emr_rc;
374 		goto fail1;
375 	}
376 
377 	if (req.emr_out_length_used < MC_CMD_VPORT_RECONFIGURE_OUT_LEN) {
378 		rc = EMSGSIZE;
379 		goto fail2;
380 	}
381 
382 	reset_flag = MCDI_OUT_DWORD_FIELD(req, VPORT_RECONFIGURE_OUT_FLAGS,
383 					    VPORT_RECONFIGURE_OUT_RESET_DONE);
384 
385 	if (fn_resetp != NULL)
386 		*fn_resetp = (reset_flag != 0);
387 
388 	return (0);
389 
390 fail2:
391 	EFSYS_PROBE(fail2);
392 fail1:
393 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
394 	return (rc);
395 }
396 
397 	__checkReturn	efx_rc_t
ef10_evb_vswitch_alloc(__in efx_nic_t * enp,__out efx_vswitch_id_t * vswitch_idp)398 ef10_evb_vswitch_alloc(
399 	__in		efx_nic_t *enp,
400 	__out		efx_vswitch_id_t *vswitch_idp)
401 {
402 	efx_rc_t rc;
403 	if (vswitch_idp == NULL) {
404 		rc = EINVAL;
405 		goto fail1;
406 	}
407 
408 	if ((rc = efx_mcdi_vswitch_alloc(enp, EVB_PORT_ID_ASSIGNED,
409 			EFX_VSWITCH_TYPE_VEB)) != 0) {
410 		goto fail2;
411 	}
412 
413 	*vswitch_idp = EFX_DEFAULT_VSWITCH_ID;
414 	return (0);
415 
416 fail2:
417 	EFSYS_PROBE(fail2);
418 fail1:
419 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
420 	return (rc);
421 }
422 
423 	__checkReturn	efx_rc_t
ef10_evb_vswitch_free(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id)424 ef10_evb_vswitch_free(
425 	__in		efx_nic_t *enp,
426 	__in		efx_vswitch_id_t vswitch_id)
427 {
428 	_NOTE(ARGUNUSED(vswitch_id))
429 
430 	return (efx_mcdi_vswitch_free(enp));
431 }
432 
433 	__checkReturn	efx_rc_t
ef10_evb_vport_alloc(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_type_t vport_type,__in uint16_t vid,__in boolean_t vlan_restrict,__out efx_vport_id_t * vport_idp)434 ef10_evb_vport_alloc(
435 	__in		efx_nic_t *enp,
436 	__in		efx_vswitch_id_t vswitch_id,
437 	__in		efx_vport_type_t vport_type,
438 	__in		uint16_t vid,
439 	__in		boolean_t vlan_restrict,
440 	__out		efx_vport_id_t *vport_idp)
441 {
442 	_NOTE(ARGUNUSED(vswitch_id))
443 
444 	return (efx_mcdi_vport_alloc(enp,
445 			vport_type, vid,
446 			vlan_restrict, vport_idp));
447 }
448 
449 	__checkReturn	efx_rc_t
ef10_evb_vport_free(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id)450 ef10_evb_vport_free(
451 	__in		efx_nic_t *enp,
452 	__in		efx_vswitch_id_t vswitch_id,
453 	__in		efx_vport_id_t vport_id)
454 {
455 	_NOTE(ARGUNUSED(vswitch_id))
456 
457 	return (efx_mcdi_vport_free(enp, vport_id));
458 }
459 
460 	__checkReturn			efx_rc_t
ef10_evb_vport_mac_addr_add(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id,__in_bcount (EFX_MAC_ADDR_LEN)uint8_t * addrp)461 ef10_evb_vport_mac_addr_add(
462 	__in				efx_nic_t *enp,
463 	__in				efx_vswitch_id_t vswitch_id,
464 	__in				efx_vport_id_t vport_id,
465 	__in_bcount(EFX_MAC_ADDR_LEN)	uint8_t *addrp)
466 {
467 	_NOTE(ARGUNUSED(vswitch_id))
468 	EFSYS_ASSERT(addrp != NULL);
469 
470 	return (efx_mcdi_vport_mac_addr_add(enp, vport_id, addrp));
471 }
472 
473 	__checkReturn			efx_rc_t
ef10_evb_vport_mac_addr_del(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id,__in_bcount (EFX_MAC_ADDR_LEN)uint8_t * addrp)474 ef10_evb_vport_mac_addr_del(
475 	__in				efx_nic_t *enp,
476 	__in				efx_vswitch_id_t vswitch_id,
477 	__in				efx_vport_id_t vport_id,
478 	__in_bcount(EFX_MAC_ADDR_LEN)	uint8_t *addrp)
479 {
480 	_NOTE(ARGUNUSED(vswitch_id))
481 	EFSYS_ASSERT(addrp != NULL);
482 
483 	return (efx_mcdi_vport_mac_addr_del(enp, vport_id, addrp));
484 }
485 
486 	__checkReturn	efx_rc_t
ef10_evb_vadaptor_alloc(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id)487 ef10_evb_vadaptor_alloc(
488 	__in		efx_nic_t *enp,
489 	__in		efx_vswitch_id_t vswitch_id,
490 	__in		efx_vport_id_t vport_id)
491 {
492 	_NOTE(ARGUNUSED(vswitch_id))
493 
494 	return (efx_mcdi_vadaptor_alloc(enp, vport_id));
495 }
496 
497 	__checkReturn	efx_rc_t
ef10_evb_vadaptor_free(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id)498 ef10_evb_vadaptor_free(
499 	__in		efx_nic_t *enp,
500 	__in		efx_vswitch_id_t vswitch_id,
501 	__in		efx_vport_id_t vport_id)
502 {
503 	_NOTE(ARGUNUSED(vswitch_id))
504 
505 	return (efx_mcdi_vadaptor_free(enp, vport_id));
506 }
507 
508 	__checkReturn	efx_rc_t
ef10_evb_vport_assign(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id,__in uint32_t vf_index)509 ef10_evb_vport_assign(
510 	__in		efx_nic_t *enp,
511 	__in		efx_vswitch_id_t vswitch_id,
512 	__in		efx_vport_id_t vport_id,
513 	__in	uint32_t vf_index)
514 {
515 	_NOTE(ARGUNUSED(vswitch_id))
516 
517 	return (efx_mcdi_port_assign(enp, vport_id, vf_index));
518 }
519 
520 	__checkReturn				efx_rc_t
ef10_evb_vport_reconfigure(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id,__in_opt uint16_t * vidp,__in_bcount_opt (EFX_MAC_ADDR_LEN)uint8_t * addrp,__out_opt boolean_t * fn_resetp)521 ef10_evb_vport_reconfigure(
522 	__in					efx_nic_t *enp,
523 	__in					efx_vswitch_id_t vswitch_id,
524 	__in					efx_vport_id_t vport_id,
525 	__in_opt				uint16_t *vidp,
526 	__in_bcount_opt(EFX_MAC_ADDR_LEN)	uint8_t *addrp,
527 	__out_opt				boolean_t *fn_resetp)
528 {
529 	_NOTE(ARGUNUSED(vswitch_id))
530 
531 	return (efx_mcdi_vport_reconfigure(enp, vport_id, vidp,
532 			addrp, fn_resetp));
533 }
534 
535 	__checkReturn	efx_rc_t
ef10_evb_vport_stats(__in efx_nic_t * enp,__in efx_vswitch_id_t vswitch_id,__in efx_vport_id_t vport_id,__in efsys_mem_t * esmp)536 ef10_evb_vport_stats(
537 	__in		efx_nic_t *enp,
538 	__in		efx_vswitch_id_t vswitch_id,
539 	__in		efx_vport_id_t vport_id,
540 	__in		efsys_mem_t *esmp)
541 {
542 	_NOTE(ARGUNUSED(vswitch_id))
543 
544 	return (efx_mcdi_mac_stats(enp, vport_id, esmp,
545 			EFX_STATS_UPLOAD, 0));
546 }
547 
548 #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */
549 #endif /* EFSYS_OPT_EVB */
550