xref: /dpdk/drivers/common/sfc_efx/base/ef10_impl.h (revision daa02b5cddbb8e11b31d41e2bf7bb1ae64dcae2f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2021 Xilinx, Inc.
4  * Copyright(c) 2015-2019 Solarflare Communications Inc.
5  */
6 
7 #ifndef	_SYS_EF10_IMPL_H
8 #define	_SYS_EF10_IMPL_H
9 
10 #ifdef	__cplusplus
11 extern "C" {
12 #endif
13 
14 #define	EF10_EVQ_MAXNEVS	32768
15 #define	EF10_EVQ_MINNEVS	512
16 
17 #define	EF10_RXQ_MAXNDESCS	4096
18 #define	EF10_RXQ_MINNDESCS	512
19 
20 #define	EF10_TXQ_MINNDESCS	512
21 
22 #define	EF10_EVQ_DESC_SIZE	(sizeof (efx_qword_t))
23 #define	EF10_RXQ_DESC_SIZE	(sizeof (efx_qword_t))
24 #define	EF10_TXQ_DESC_SIZE	(sizeof (efx_qword_t))
25 
26 /* Number of hardware EVQ buffers (for compile-time resource dimensions) */
27 #define	EF10_EVQ_MAXNBUFS	(64)
28 
29 /* Maximum independent of EFX_BUG35388_WORKAROUND. */
30 #define	EF10_TXQ_MAXNBUFS	8
31 
32 #if EFSYS_OPT_HUNTINGTON
33 # if (EF10_EVQ_MAXNBUFS < HUNT_EVQ_MAXNBUFS)
34 #  error "EF10_EVQ_MAXNBUFS too small"
35 # endif
36 #endif /* EFSYS_OPT_HUNTINGTON */
37 #if EFSYS_OPT_MEDFORD
38 # if (EF10_EVQ_MAXNBUFS < MEDFORD_EVQ_MAXNBUFS)
39 #  error "EF10_EVQ_MAXNBUFS too small"
40 # endif
41 #endif /* EFSYS_OPT_MEDFORD */
42 #if EFSYS_OPT_MEDFORD2
43 # if (EF10_EVQ_MAXNBUFS < MEDFORD2_EVQ_MAXNBUFS)
44 #  error "EF10_EVQ_MAXNBUFS too small"
45 # endif
46 #endif /* EFSYS_OPT_MEDFORD2 */
47 
48 /* Number of hardware PIO buffers (for compile-time resource dimensions) */
49 #define	EF10_MAX_PIOBUF_NBUFS	(16)
50 
51 #if EFSYS_OPT_HUNTINGTON
52 # if (EF10_MAX_PIOBUF_NBUFS < HUNT_PIOBUF_NBUFS)
53 #  error "EF10_MAX_PIOBUF_NBUFS too small"
54 # endif
55 #endif /* EFSYS_OPT_HUNTINGTON */
56 #if EFSYS_OPT_MEDFORD
57 # if (EF10_MAX_PIOBUF_NBUFS < MEDFORD_PIOBUF_NBUFS)
58 #  error "EF10_MAX_PIOBUF_NBUFS too small"
59 # endif
60 #endif /* EFSYS_OPT_MEDFORD */
61 #if EFSYS_OPT_MEDFORD2
62 # if (EF10_MAX_PIOBUF_NBUFS < MEDFORD2_PIOBUF_NBUFS)
63 #  error "EF10_MAX_PIOBUF_NBUFS too small"
64 # endif
65 #endif /* EFSYS_OPT_MEDFORD2 */
66 
67 
68 
69 /*
70  * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could
71  * possibly be increased, or the write size reported by newer firmware used
72  * instead.
73  */
74 #define	EF10_NVRAM_CHUNK 0x80
75 
76 /*
77  * Alignment requirement for value written to RX WPTR: the WPTR must be aligned
78  * to an 8 descriptor boundary.
79  */
80 #define	EF10_RX_WPTR_ALIGN 8
81 
82 /*
83  * Max byte offset into the packet the TCP header must start for the hardware
84  * to be able to parse the packet correctly.
85  */
86 #define	EF10_TCP_HEADER_OFFSET_LIMIT	208
87 
88 /* Invalid RSS context handle */
89 #define	EF10_RSS_CONTEXT_INVALID	(0xffffffff)
90 
91 
92 /* EV */
93 
94 LIBEFX_INTERNAL
95 extern	__checkReturn	efx_rc_t
96 ef10_ev_init(
97 	__in		efx_nic_t *enp);
98 
99 LIBEFX_INTERNAL
100 extern			void
101 ef10_ev_fini(
102 	__in		efx_nic_t *enp);
103 
104 LIBEFX_INTERNAL
105 extern	__checkReturn	efx_rc_t
106 ef10_ev_qcreate(
107 	__in		efx_nic_t *enp,
108 	__in		unsigned int index,
109 	__in		efsys_mem_t *esmp,
110 	__in		size_t ndescs,
111 	__in		uint32_t id,
112 	__in		uint32_t us,
113 	__in		uint32_t flags,
114 	__in		uint32_t irq,
115 	__in		efx_evq_t *eep);
116 
117 LIBEFX_INTERNAL
118 extern			void
119 ef10_ev_qdestroy(
120 	__in		efx_evq_t *eep);
121 
122 LIBEFX_INTERNAL
123 extern	__checkReturn	efx_rc_t
124 ef10_ev_qprime(
125 	__in		efx_evq_t *eep,
126 	__in		unsigned int count);
127 
128 LIBEFX_INTERNAL
129 extern			void
130 ef10_ev_qpost(
131 	__in	efx_evq_t *eep,
132 	__in	uint16_t data);
133 
134 LIBEFX_INTERNAL
135 extern	__checkReturn	efx_rc_t
136 ef10_ev_qmoderate(
137 	__in		efx_evq_t *eep,
138 	__in		unsigned int us);
139 
140 #if EFSYS_OPT_QSTATS
141 LIBEFX_INTERNAL
142 extern			void
143 ef10_ev_qstats_update(
144 	__in				efx_evq_t *eep,
145 	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
146 #endif /* EFSYS_OPT_QSTATS */
147 
148 LIBEFX_INTERNAL
149 extern			void
150 ef10_ev_rxlabel_init(
151 	__in		efx_evq_t *eep,
152 	__in		efx_rxq_t *erp,
153 	__in		unsigned int label,
154 	__in		efx_rxq_type_t type);
155 
156 LIBEFX_INTERNAL
157 extern			void
158 ef10_ev_rxlabel_fini(
159 	__in		efx_evq_t *eep,
160 	__in		unsigned int label);
161 
162 LIBEFX_INTERNAL
163 extern	__checkReturn	boolean_t
164 ef10_ev_mcdi(
165 	__in		efx_evq_t *eep,
166 	__in		efx_qword_t *eqp,
167 	__in		const efx_ev_callbacks_t *eecp,
168 	__in_opt	void *arg);
169 
170 /* INTR */
171 
172 LIBEFX_INTERNAL
173 extern	__checkReturn	efx_rc_t
174 ef10_intr_init(
175 	__in		efx_nic_t *enp,
176 	__in		efx_intr_type_t type,
177 	__in		efsys_mem_t *esmp);
178 
179 LIBEFX_INTERNAL
180 extern			void
181 ef10_intr_enable(
182 	__in		efx_nic_t *enp);
183 
184 LIBEFX_INTERNAL
185 extern			void
186 ef10_intr_disable(
187 	__in		efx_nic_t *enp);
188 
189 LIBEFX_INTERNAL
190 extern			void
191 ef10_intr_disable_unlocked(
192 	__in		efx_nic_t *enp);
193 
194 LIBEFX_INTERNAL
195 extern	__checkReturn	efx_rc_t
196 ef10_intr_trigger(
197 	__in		efx_nic_t *enp,
198 	__in		unsigned int level);
199 
200 LIBEFX_INTERNAL
201 extern			void
202 ef10_intr_status_line(
203 	__in		efx_nic_t *enp,
204 	__out		boolean_t *fatalp,
205 	__out		uint32_t *qmaskp);
206 
207 LIBEFX_INTERNAL
208 extern			void
209 ef10_intr_status_message(
210 	__in		efx_nic_t *enp,
211 	__in		unsigned int message,
212 	__out		boolean_t *fatalp);
213 
214 LIBEFX_INTERNAL
215 extern			void
216 ef10_intr_fatal(
217 	__in		efx_nic_t *enp);
218 
219 LIBEFX_INTERNAL
220 extern			void
221 ef10_intr_fini(
222 	__in		efx_nic_t *enp);
223 
224 /* NIC */
225 
226 LIBEFX_INTERNAL
227 extern	__checkReturn	efx_rc_t
228 efx_mcdi_vadaptor_alloc(
229 	__in		efx_nic_t *enp,
230 	__in		uint32_t port_id);
231 
232 LIBEFX_INTERNAL
233 extern	__checkReturn	efx_rc_t
234 efx_mcdi_vadaptor_free(
235 	__in		efx_nic_t *enp,
236 	__in		uint32_t port_id);
237 
238 LIBEFX_INTERNAL
239 extern	__checkReturn	efx_rc_t
240 ef10_upstream_port_vadaptor_alloc(
241 	__in		efx_nic_t *enp);
242 
243 LIBEFX_INTERNAL
244 extern	__checkReturn	efx_rc_t
245 ef10_nic_probe(
246 	__in		efx_nic_t *enp);
247 
248 LIBEFX_INTERNAL
249 extern	__checkReturn	efx_rc_t
250 ef10_nic_set_drv_limits(
251 	__inout		efx_nic_t *enp,
252 	__in		efx_drv_limits_t *edlp);
253 
254 LIBEFX_INTERNAL
255 extern	__checkReturn	efx_rc_t
256 ef10_nic_get_vi_pool(
257 	__in		efx_nic_t *enp,
258 	__out		uint32_t *vi_countp);
259 
260 LIBEFX_INTERNAL
261 extern	__checkReturn	efx_rc_t
262 ef10_nic_get_bar_region(
263 	__in		efx_nic_t *enp,
264 	__in		efx_nic_region_t region,
265 	__out		uint32_t *offsetp,
266 	__out		size_t *sizep);
267 
268 LIBEFX_INTERNAL
269 extern	__checkReturn	efx_rc_t
270 ef10_nic_reset(
271 	__in		efx_nic_t *enp);
272 
273 LIBEFX_INTERNAL
274 extern	__checkReturn	efx_rc_t
275 ef10_nic_init(
276 	__in		efx_nic_t *enp);
277 
278 LIBEFX_INTERNAL
279 extern	__checkReturn	boolean_t
280 ef10_nic_hw_unavailable(
281 	__in		efx_nic_t *enp);
282 
283 LIBEFX_INTERNAL
284 extern			void
285 ef10_nic_set_hw_unavailable(
286 	__in		efx_nic_t *enp);
287 
288 #if EFSYS_OPT_DIAG
289 
290 LIBEFX_INTERNAL
291 extern	__checkReturn	efx_rc_t
292 ef10_nic_register_test(
293 	__in		efx_nic_t *enp);
294 
295 #endif	/* EFSYS_OPT_DIAG */
296 
297 LIBEFX_INTERNAL
298 extern			void
299 ef10_nic_fini(
300 	__in		efx_nic_t *enp);
301 
302 LIBEFX_INTERNAL
303 extern			void
304 ef10_nic_unprobe(
305 	__in		efx_nic_t *enp);
306 
307 
308 /* MAC */
309 
310 LIBEFX_INTERNAL
311 extern	__checkReturn	efx_rc_t
312 ef10_mac_poll(
313 	__in		efx_nic_t *enp,
314 	__out		efx_link_mode_t *link_modep);
315 
316 LIBEFX_INTERNAL
317 extern	__checkReturn	efx_rc_t
318 ef10_mac_up(
319 	__in		efx_nic_t *enp,
320 	__out		boolean_t *mac_upp);
321 
322 LIBEFX_INTERNAL
323 extern	__checkReturn	efx_rc_t
324 ef10_mac_addr_set(
325 	__in	efx_nic_t *enp);
326 
327 LIBEFX_INTERNAL
328 extern	__checkReturn	efx_rc_t
329 ef10_mac_pdu_set(
330 	__in	efx_nic_t *enp);
331 
332 LIBEFX_INTERNAL
333 extern	__checkReturn	efx_rc_t
334 ef10_mac_pdu_get(
335 	__in	efx_nic_t *enp,
336 	__out	size_t *pdu);
337 
338 LIBEFX_INTERNAL
339 extern	__checkReturn	efx_rc_t
340 ef10_mac_reconfigure(
341 	__in	efx_nic_t *enp);
342 
343 LIBEFX_INTERNAL
344 extern	__checkReturn	efx_rc_t
345 ef10_mac_multicast_list_set(
346 	__in				efx_nic_t *enp);
347 
348 LIBEFX_INTERNAL
349 extern	__checkReturn	efx_rc_t
350 ef10_mac_filter_default_rxq_set(
351 	__in		efx_nic_t *enp,
352 	__in		efx_rxq_t *erp,
353 	__in		boolean_t using_rss);
354 
355 LIBEFX_INTERNAL
356 extern			void
357 ef10_mac_filter_default_rxq_clear(
358 	__in		efx_nic_t *enp);
359 
360 #if EFSYS_OPT_LOOPBACK
361 
362 LIBEFX_INTERNAL
363 extern	__checkReturn	efx_rc_t
364 ef10_mac_loopback_set(
365 	__in		efx_nic_t *enp,
366 	__in		efx_link_mode_t link_mode,
367 	__in		efx_loopback_type_t loopback_type);
368 
369 #endif	/* EFSYS_OPT_LOOPBACK */
370 
371 #if EFSYS_OPT_MAC_STATS
372 
373 LIBEFX_INTERNAL
374 extern	__checkReturn			efx_rc_t
375 ef10_mac_stats_get_mask(
376 	__in				efx_nic_t *enp,
377 	__inout_bcount(mask_size)	uint32_t *maskp,
378 	__in				size_t mask_size);
379 
380 LIBEFX_INTERNAL
381 extern	__checkReturn			efx_rc_t
382 ef10_mac_stats_update(
383 	__in				efx_nic_t *enp,
384 	__in				efsys_mem_t *esmp,
385 	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
386 	__inout_opt			uint32_t *generationp);
387 
388 #endif	/* EFSYS_OPT_MAC_STATS */
389 
390 
391 /* MCDI */
392 
393 #if EFSYS_OPT_MCDI
394 
395 LIBEFX_INTERNAL
396 extern	__checkReturn	efx_rc_t
397 ef10_mcdi_init(
398 	__in		efx_nic_t *enp,
399 	__in		const efx_mcdi_transport_t *mtp);
400 
401 LIBEFX_INTERNAL
402 extern			void
403 ef10_mcdi_fini(
404 	__in		efx_nic_t *enp);
405 
406 LIBEFX_INTERNAL
407 extern			void
408 ef10_mcdi_send_request(
409 	__in			efx_nic_t *enp,
410 	__in_bcount(hdr_len)	void *hdrp,
411 	__in			size_t hdr_len,
412 	__in_bcount(sdu_len)	void *sdup,
413 	__in			size_t sdu_len);
414 
415 LIBEFX_INTERNAL
416 extern	__checkReturn	boolean_t
417 ef10_mcdi_poll_response(
418 	__in		efx_nic_t *enp);
419 
420 LIBEFX_INTERNAL
421 extern			void
422 ef10_mcdi_read_response(
423 	__in			efx_nic_t *enp,
424 	__out_bcount(length)	void *bufferp,
425 	__in			size_t offset,
426 	__in			size_t length);
427 
428 LIBEFX_INTERNAL
429 extern			efx_rc_t
430 ef10_mcdi_poll_reboot(
431 	__in		efx_nic_t *enp);
432 
433 LIBEFX_INTERNAL
434 extern	__checkReturn	efx_rc_t
435 ef10_mcdi_feature_supported(
436 	__in		efx_nic_t *enp,
437 	__in		efx_mcdi_feature_id_t id,
438 	__out		boolean_t *supportedp);
439 
440 LIBEFX_INTERNAL
441 extern			void
442 ef10_mcdi_get_timeout(
443 	__in		efx_nic_t *enp,
444 	__in		efx_mcdi_req_t *emrp,
445 	__out		uint32_t *timeoutp);
446 
447 #endif /* EFSYS_OPT_MCDI */
448 
449 /* NVRAM */
450 
451 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
452 
453 LIBEFX_INTERNAL
454 extern	__checkReturn		efx_rc_t
455 ef10_nvram_buf_read_tlv(
456 	__in				efx_nic_t *enp,
457 	__in_bcount(max_seg_size)	caddr_t seg_data,
458 	__in				size_t max_seg_size,
459 	__in				uint32_t tag,
460 	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
461 	__out				size_t *sizep);
462 
463 LIBEFX_INTERNAL
464 extern	__checkReturn		efx_rc_t
465 ef10_nvram_buf_write_tlv(
466 	__inout_bcount(partn_size)	caddr_t partn_data,
467 	__in				size_t partn_size,
468 	__in				uint32_t tag,
469 	__in_bcount(tag_size)		caddr_t tag_data,
470 	__in				size_t tag_size,
471 	__out				size_t *total_lengthp);
472 
473 LIBEFX_INTERNAL
474 extern	__checkReturn		efx_rc_t
475 ef10_nvram_partn_read_tlv(
476 	__in				efx_nic_t *enp,
477 	__in				uint32_t partn,
478 	__in				uint32_t tag,
479 	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
480 	__out				size_t *sizep);
481 
482 LIBEFX_INTERNAL
483 extern	__checkReturn		efx_rc_t
484 ef10_nvram_partn_write_tlv(
485 	__in			efx_nic_t *enp,
486 	__in			uint32_t partn,
487 	__in			uint32_t tag,
488 	__in_bcount(size)	caddr_t data,
489 	__in			size_t size);
490 
491 LIBEFX_INTERNAL
492 extern	__checkReturn		efx_rc_t
493 ef10_nvram_partn_write_segment_tlv(
494 	__in			efx_nic_t *enp,
495 	__in			uint32_t partn,
496 	__in			uint32_t tag,
497 	__in_bcount(size)	caddr_t data,
498 	__in			size_t size,
499 	__in			boolean_t all_segments);
500 
501 LIBEFX_INTERNAL
502 extern	__checkReturn		efx_rc_t
503 ef10_nvram_partn_lock(
504 	__in			efx_nic_t *enp,
505 	__in			uint32_t partn);
506 
507 LIBEFX_INTERNAL
508 extern	__checkReturn		efx_rc_t
509 ef10_nvram_partn_unlock(
510 	__in			efx_nic_t *enp,
511 	__in			uint32_t partn,
512 	__out_opt		uint32_t *resultp);
513 
514 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
515 
516 #if EFSYS_OPT_NVRAM
517 
518 #if EFSYS_OPT_DIAG
519 
520 LIBEFX_INTERNAL
521 extern	__checkReturn		efx_rc_t
522 ef10_nvram_test(
523 	__in			efx_nic_t *enp);
524 
525 #endif	/* EFSYS_OPT_DIAG */
526 
527 LIBEFX_INTERNAL
528 extern	__checkReturn		efx_rc_t
529 ef10_nvram_type_to_partn(
530 	__in			efx_nic_t *enp,
531 	__in			efx_nvram_type_t type,
532 	__out			uint32_t *partnp);
533 
534 LIBEFX_INTERNAL
535 extern	__checkReturn		efx_rc_t
536 ef10_nvram_partn_size(
537 	__in			efx_nic_t *enp,
538 	__in			uint32_t partn,
539 	__out			size_t *sizep);
540 
541 LIBEFX_INTERNAL
542 extern	__checkReturn		efx_rc_t
543 ef10_nvram_partn_info(
544 	__in			efx_nic_t *enp,
545 	__in			uint32_t partn,
546 	__out			efx_nvram_info_t * enip);
547 
548 LIBEFX_INTERNAL
549 extern	__checkReturn		efx_rc_t
550 ef10_nvram_partn_rw_start(
551 	__in			efx_nic_t *enp,
552 	__in			uint32_t partn,
553 	__out			size_t *chunk_sizep);
554 
555 LIBEFX_INTERNAL
556 extern	__checkReturn		efx_rc_t
557 ef10_nvram_partn_read_mode(
558 	__in			efx_nic_t *enp,
559 	__in			uint32_t partn,
560 	__in			unsigned int offset,
561 	__out_bcount(size)	caddr_t data,
562 	__in			size_t size,
563 	__in			uint32_t mode);
564 
565 LIBEFX_INTERNAL
566 extern	__checkReturn		efx_rc_t
567 ef10_nvram_partn_read(
568 	__in			efx_nic_t *enp,
569 	__in			uint32_t partn,
570 	__in			unsigned int offset,
571 	__out_bcount(size)	caddr_t data,
572 	__in			size_t size);
573 
574 LIBEFX_INTERNAL
575 extern	__checkReturn		efx_rc_t
576 ef10_nvram_partn_read_backup(
577 	__in			efx_nic_t *enp,
578 	__in			uint32_t partn,
579 	__in			unsigned int offset,
580 	__out_bcount(size)	caddr_t data,
581 	__in			size_t size);
582 
583 LIBEFX_INTERNAL
584 extern	__checkReturn		efx_rc_t
585 ef10_nvram_partn_erase(
586 	__in			efx_nic_t *enp,
587 	__in			uint32_t partn,
588 	__in			unsigned int offset,
589 	__in			size_t size);
590 
591 LIBEFX_INTERNAL
592 extern	__checkReturn		efx_rc_t
593 ef10_nvram_partn_write(
594 	__in			efx_nic_t *enp,
595 	__in			uint32_t partn,
596 	__in			unsigned int offset,
597 	__in_bcount(size)	caddr_t data,
598 	__in			size_t size);
599 
600 LIBEFX_INTERNAL
601 extern	__checkReturn		efx_rc_t
602 ef10_nvram_partn_rw_finish(
603 	__in			efx_nic_t *enp,
604 	__in			uint32_t partn,
605 	__out_opt		uint32_t *verify_resultp);
606 
607 LIBEFX_INTERNAL
608 extern	__checkReturn		efx_rc_t
609 ef10_nvram_partn_get_version(
610 	__in			efx_nic_t *enp,
611 	__in			uint32_t partn,
612 	__out			uint32_t *subtypep,
613 	__out_ecount(4)		uint16_t version[4]);
614 
615 LIBEFX_INTERNAL
616 extern	__checkReturn		efx_rc_t
617 ef10_nvram_partn_set_version(
618 	__in			efx_nic_t *enp,
619 	__in			uint32_t partn,
620 	__in_ecount(4)		uint16_t version[4]);
621 
622 LIBEFX_INTERNAL
623 extern	__checkReturn		efx_rc_t
624 ef10_nvram_buffer_validate(
625 	__in			uint32_t partn,
626 	__in_bcount(buffer_size)
627 				caddr_t bufferp,
628 	__in			size_t buffer_size);
629 
630 LIBEFX_INTERNAL
631 extern			void
632 ef10_nvram_buffer_init(
633 	__out_bcount(buffer_size)
634 				caddr_t bufferp,
635 	__in			size_t buffer_size);
636 
637 LIBEFX_INTERNAL
638 extern	__checkReturn		efx_rc_t
639 ef10_nvram_buffer_create(
640 	__in			uint32_t partn_type,
641 	__out_bcount(buffer_size)
642 				caddr_t bufferp,
643 	__in			size_t buffer_size);
644 
645 LIBEFX_INTERNAL
646 extern	__checkReturn		efx_rc_t
647 ef10_nvram_buffer_find_item_start(
648 	__in_bcount(buffer_size)
649 				caddr_t bufferp,
650 	__in			size_t buffer_size,
651 	__out			uint32_t *startp);
652 
653 LIBEFX_INTERNAL
654 extern	__checkReturn		efx_rc_t
655 ef10_nvram_buffer_find_end(
656 	__in_bcount(buffer_size)
657 				caddr_t bufferp,
658 	__in			size_t buffer_size,
659 	__in			uint32_t offset,
660 	__out			uint32_t *endp);
661 
662 LIBEFX_INTERNAL
663 extern	__checkReturn	__success(return != B_FALSE)	boolean_t
664 ef10_nvram_buffer_find_item(
665 	__in_bcount(buffer_size)
666 				caddr_t bufferp,
667 	__in			size_t buffer_size,
668 	__in			uint32_t offset,
669 	__out			uint32_t *startp,
670 	__out			uint32_t *lengthp);
671 
672 LIBEFX_INTERNAL
673 extern	__checkReturn		efx_rc_t
674 ef10_nvram_buffer_peek_item(
675 	__in_bcount(buffer_size)
676 				caddr_t bufferp,
677 	__in			size_t buffer_size,
678 	__in			uint32_t offset,
679 	__out			uint32_t *tagp,
680 	__out			uint32_t *lengthp,
681 	__out			uint32_t *value_offsetp);
682 
683 LIBEFX_INTERNAL
684 extern	__checkReturn		efx_rc_t
685 ef10_nvram_buffer_get_item(
686 	__in_bcount(buffer_size)
687 				caddr_t bufferp,
688 	__in			size_t buffer_size,
689 	__in			uint32_t offset,
690 	__in			uint32_t length,
691 	__out			uint32_t *tagp,
692 	__out_bcount_part(value_max_size, *lengthp)
693 				caddr_t valuep,
694 	__in			size_t value_max_size,
695 	__out			uint32_t *lengthp);
696 
697 LIBEFX_INTERNAL
698 extern	__checkReturn		efx_rc_t
699 ef10_nvram_buffer_insert_item(
700 	__in_bcount(buffer_size)
701 				caddr_t bufferp,
702 	__in			size_t buffer_size,
703 	__in			uint32_t offset,
704 	__in			uint32_t tag,
705 	__in_bcount(length)	caddr_t valuep,
706 	__in			uint32_t length,
707 	__out			uint32_t *lengthp);
708 
709 LIBEFX_INTERNAL
710 extern	__checkReturn		efx_rc_t
711 ef10_nvram_buffer_modify_item(
712 	__in_bcount(buffer_size)
713 				caddr_t bufferp,
714 	__in			size_t buffer_size,
715 	__in			uint32_t offset,
716 	__in			uint32_t tag,
717 	__in_bcount(length)	caddr_t valuep,
718 	__in			uint32_t length,
719 	__out			uint32_t *lengthp);
720 
721 LIBEFX_INTERNAL
722 extern	__checkReturn		efx_rc_t
723 ef10_nvram_buffer_delete_item(
724 	__in_bcount(buffer_size)
725 				caddr_t bufferp,
726 	__in			size_t buffer_size,
727 	__in			uint32_t offset,
728 	__in			uint32_t length,
729 	__in			uint32_t end);
730 
731 LIBEFX_INTERNAL
732 extern	__checkReturn		efx_rc_t
733 ef10_nvram_buffer_finish(
734 	__in_bcount(buffer_size)
735 				caddr_t bufferp,
736 	__in			size_t buffer_size);
737 
738 #endif	/* EFSYS_OPT_NVRAM */
739 
740 
741 /* PHY */
742 
743 typedef struct ef10_link_state_s {
744 	efx_phy_link_state_t	epls;
745 #if EFSYS_OPT_LOOPBACK
746 	efx_loopback_type_t	els_loopback;
747 #endif
748 	boolean_t		els_mac_up;
749 } ef10_link_state_t;
750 
751 LIBEFX_INTERNAL
752 extern			void
753 ef10_phy_link_ev(
754 	__in		efx_nic_t *enp,
755 	__in		efx_qword_t *eqp,
756 	__out		efx_link_mode_t *link_modep);
757 
758 LIBEFX_INTERNAL
759 extern	__checkReturn	efx_rc_t
760 ef10_phy_get_link(
761 	__in		efx_nic_t *enp,
762 	__out		ef10_link_state_t *elsp);
763 
764 LIBEFX_INTERNAL
765 extern	__checkReturn	efx_rc_t
766 ef10_phy_power(
767 	__in		efx_nic_t *enp,
768 	__in		boolean_t on);
769 
770 LIBEFX_INTERNAL
771 extern	__checkReturn	efx_rc_t
772 ef10_phy_reconfigure(
773 	__in		efx_nic_t *enp);
774 
775 LIBEFX_INTERNAL
776 extern	__checkReturn	efx_rc_t
777 ef10_phy_verify(
778 	__in		efx_nic_t *enp);
779 
780 LIBEFX_INTERNAL
781 extern	__checkReturn	efx_rc_t
782 ef10_phy_oui_get(
783 	__in		efx_nic_t *enp,
784 	__out		uint32_t *ouip);
785 
786 LIBEFX_INTERNAL
787 extern	__checkReturn	efx_rc_t
788 ef10_phy_link_state_get(
789 	__in		efx_nic_t *enp,
790 	__out		efx_phy_link_state_t *eplsp);
791 
792 #if EFSYS_OPT_PHY_STATS
793 
794 LIBEFX_INTERNAL
795 extern	__checkReturn			efx_rc_t
796 ef10_phy_stats_update(
797 	__in				efx_nic_t *enp,
798 	__in				efsys_mem_t *esmp,
799 	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
800 
801 #endif	/* EFSYS_OPT_PHY_STATS */
802 
803 #if EFSYS_OPT_BIST
804 
805 LIBEFX_INTERNAL
806 extern	__checkReturn		efx_rc_t
807 ef10_bist_enable_offline(
808 	__in			efx_nic_t *enp);
809 
810 LIBEFX_INTERNAL
811 extern	__checkReturn		efx_rc_t
812 ef10_bist_start(
813 	__in			efx_nic_t *enp,
814 	__in			efx_bist_type_t type);
815 
816 LIBEFX_INTERNAL
817 extern	__checkReturn		efx_rc_t
818 ef10_bist_poll(
819 	__in			efx_nic_t *enp,
820 	__in			efx_bist_type_t type,
821 	__out			efx_bist_result_t *resultp,
822 	__out_opt __drv_when(count > 0, __notnull)
823 	uint32_t	*value_maskp,
824 	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
825 	unsigned long	*valuesp,
826 	__in			size_t count);
827 
828 LIBEFX_INTERNAL
829 extern				void
830 ef10_bist_stop(
831 	__in			efx_nic_t *enp,
832 	__in			efx_bist_type_t type);
833 
834 #endif	/* EFSYS_OPT_BIST */
835 
836 /* TX */
837 
838 LIBEFX_INTERNAL
839 extern	__checkReturn	efx_rc_t
840 ef10_tx_init(
841 	__in		efx_nic_t *enp);
842 
843 LIBEFX_INTERNAL
844 extern			void
845 ef10_tx_fini(
846 	__in		efx_nic_t *enp);
847 
848 LIBEFX_INTERNAL
849 extern	__checkReturn	efx_rc_t
850 ef10_tx_qcreate(
851 	__in		efx_nic_t *enp,
852 	__in		unsigned int index,
853 	__in		unsigned int label,
854 	__in		efsys_mem_t *esmp,
855 	__in		size_t ndescs,
856 	__in		uint32_t id,
857 	__in		uint16_t flags,
858 	__in		efx_evq_t *eep,
859 	__in		efx_txq_t *etp,
860 	__out		unsigned int *addedp);
861 
862 LIBEFX_INTERNAL
863 extern		void
864 ef10_tx_qdestroy(
865 	__in		efx_txq_t *etp);
866 
867 LIBEFX_INTERNAL
868 extern	__checkReturn		efx_rc_t
869 ef10_tx_qpost(
870 	__in			efx_txq_t *etp,
871 	__in_ecount(ndescs)	efx_buffer_t *ebp,
872 	__in			unsigned int ndescs,
873 	__in			unsigned int completed,
874 	__inout			unsigned int *addedp);
875 
876 LIBEFX_INTERNAL
877 extern			void
878 ef10_tx_qpush(
879 	__in		efx_txq_t *etp,
880 	__in		unsigned int added,
881 	__in		unsigned int pushed);
882 
883 #if EFSYS_OPT_RX_PACKED_STREAM
884 LIBEFX_INTERNAL
885 extern			void
886 ef10_rx_qpush_ps_credits(
887 	__in		efx_rxq_t *erp);
888 
889 LIBEFX_INTERNAL
890 extern	__checkReturn	uint8_t *
891 ef10_rx_qps_packet_info(
892 	__in		efx_rxq_t *erp,
893 	__in		uint8_t *buffer,
894 	__in		uint32_t buffer_length,
895 	__in		uint32_t current_offset,
896 	__out		uint16_t *lengthp,
897 	__out		uint32_t *next_offsetp,
898 	__out		uint32_t *timestamp);
899 #endif
900 
901 LIBEFX_INTERNAL
902 extern	__checkReturn	efx_rc_t
903 ef10_tx_qpace(
904 	__in		efx_txq_t *etp,
905 	__in		unsigned int ns);
906 
907 LIBEFX_INTERNAL
908 extern	__checkReturn	efx_rc_t
909 ef10_tx_qflush(
910 	__in		efx_txq_t *etp);
911 
912 LIBEFX_INTERNAL
913 extern			void
914 ef10_tx_qenable(
915 	__in		efx_txq_t *etp);
916 
917 LIBEFX_INTERNAL
918 extern	__checkReturn	efx_rc_t
919 ef10_tx_qpio_enable(
920 	__in		efx_txq_t *etp);
921 
922 LIBEFX_INTERNAL
923 extern			void
924 ef10_tx_qpio_disable(
925 	__in		efx_txq_t *etp);
926 
927 LIBEFX_INTERNAL
928 extern	__checkReturn	efx_rc_t
929 ef10_tx_qpio_write(
930 	__in			efx_txq_t *etp,
931 	__in_ecount(buf_length)	uint8_t *buffer,
932 	__in			size_t buf_length,
933 	__in			size_t pio_buf_offset);
934 
935 LIBEFX_INTERNAL
936 extern	__checkReturn	efx_rc_t
937 ef10_tx_qpio_post(
938 	__in			efx_txq_t *etp,
939 	__in			size_t pkt_length,
940 	__in			unsigned int completed,
941 	__inout			unsigned int *addedp);
942 
943 LIBEFX_INTERNAL
944 extern	__checkReturn	efx_rc_t
945 ef10_tx_qdesc_post(
946 	__in		efx_txq_t *etp,
947 	__in_ecount(n)	efx_desc_t *ed,
948 	__in		unsigned int n,
949 	__in		unsigned int completed,
950 	__inout		unsigned int *addedp);
951 
952 LIBEFX_INTERNAL
953 extern	void
954 ef10_tx_qdesc_dma_create(
955 	__in	efx_txq_t *etp,
956 	__in	efsys_dma_addr_t addr,
957 	__in	size_t size,
958 	__in	boolean_t eop,
959 	__out	efx_desc_t *edp);
960 
961 LIBEFX_INTERNAL
962 extern	void
963 ef10_tx_qdesc_tso_create(
964 	__in	efx_txq_t *etp,
965 	__in	uint16_t ipv4_id,
966 	__in	uint32_t tcp_seq,
967 	__in	uint8_t	 tcp_flags,
968 	__out	efx_desc_t *edp);
969 
970 LIBEFX_INTERNAL
971 extern	void
972 ef10_tx_qdesc_tso2_create(
973 	__in			efx_txq_t *etp,
974 	__in			uint16_t ipv4_id,
975 	__in			uint16_t outer_ipv4_id,
976 	__in			uint32_t tcp_seq,
977 	__in			uint16_t tcp_mss,
978 	__out_ecount(count)	efx_desc_t *edp,
979 	__in			int count);
980 
981 LIBEFX_INTERNAL
982 extern	void
983 ef10_tx_qdesc_vlantci_create(
984 	__in	efx_txq_t *etp,
985 	__in	uint16_t vlan_tci,
986 	__out	efx_desc_t *edp);
987 
988 LIBEFX_INTERNAL
989 extern	void
990 ef10_tx_qdesc_checksum_create(
991 	__in	efx_txq_t *etp,
992 	__in	uint16_t flags,
993 	__out	efx_desc_t *edp);
994 
995 #if EFSYS_OPT_QSTATS
996 
997 LIBEFX_INTERNAL
998 extern			void
999 ef10_tx_qstats_update(
1000 	__in				efx_txq_t *etp,
1001 	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
1002 
1003 #endif /* EFSYS_OPT_QSTATS */
1004 
1005 typedef uint32_t	efx_piobuf_handle_t;
1006 
1007 #define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t)-1)
1008 
1009 LIBEFX_INTERNAL
1010 extern	__checkReturn	efx_rc_t
1011 ef10_nic_pio_alloc(
1012 	__inout		efx_nic_t *enp,
1013 	__out		uint32_t *bufnump,
1014 	__out		efx_piobuf_handle_t *handlep,
1015 	__out		uint32_t *blknump,
1016 	__out		uint32_t *offsetp,
1017 	__out		size_t *sizep);
1018 
1019 LIBEFX_INTERNAL
1020 extern	__checkReturn	efx_rc_t
1021 ef10_nic_pio_free(
1022 	__inout		efx_nic_t *enp,
1023 	__in		uint32_t bufnum,
1024 	__in		uint32_t blknum);
1025 
1026 LIBEFX_INTERNAL
1027 extern	__checkReturn	efx_rc_t
1028 ef10_nic_pio_link(
1029 	__inout		efx_nic_t *enp,
1030 	__in		uint32_t vi_index,
1031 	__in		efx_piobuf_handle_t handle);
1032 
1033 LIBEFX_INTERNAL
1034 extern	__checkReturn	efx_rc_t
1035 ef10_nic_pio_unlink(
1036 	__inout		efx_nic_t *enp,
1037 	__in		uint32_t vi_index);
1038 
1039 
1040 /* VPD */
1041 
1042 #if EFSYS_OPT_VPD
1043 
1044 LIBEFX_INTERNAL
1045 extern	__checkReturn		efx_rc_t
1046 ef10_vpd_init(
1047 	__in			efx_nic_t *enp);
1048 
1049 LIBEFX_INTERNAL
1050 extern	__checkReturn		efx_rc_t
1051 ef10_vpd_size(
1052 	__in			efx_nic_t *enp,
1053 	__out			size_t *sizep);
1054 
1055 LIBEFX_INTERNAL
1056 extern	__checkReturn		efx_rc_t
1057 ef10_vpd_read(
1058 	__in			efx_nic_t *enp,
1059 	__out_bcount(size)	caddr_t data,
1060 	__in			size_t size);
1061 
1062 LIBEFX_INTERNAL
1063 extern	__checkReturn		efx_rc_t
1064 ef10_vpd_verify(
1065 	__in			efx_nic_t *enp,
1066 	__in_bcount(size)	caddr_t data,
1067 	__in			size_t size);
1068 
1069 LIBEFX_INTERNAL
1070 extern	__checkReturn		efx_rc_t
1071 ef10_vpd_reinit(
1072 	__in			efx_nic_t *enp,
1073 	__in_bcount(size)	caddr_t data,
1074 	__in			size_t size);
1075 
1076 LIBEFX_INTERNAL
1077 extern	__checkReturn		efx_rc_t
1078 ef10_vpd_get(
1079 	__in			efx_nic_t *enp,
1080 	__in_bcount(size)	caddr_t data,
1081 	__in			size_t size,
1082 	__inout			efx_vpd_value_t *evvp);
1083 
1084 LIBEFX_INTERNAL
1085 extern	__checkReturn		efx_rc_t
1086 ef10_vpd_set(
1087 	__in			efx_nic_t *enp,
1088 	__in_bcount(size)	caddr_t data,
1089 	__in			size_t size,
1090 	__in			efx_vpd_value_t *evvp);
1091 
1092 LIBEFX_INTERNAL
1093 extern	__checkReturn		efx_rc_t
1094 ef10_vpd_next(
1095 	__in			efx_nic_t *enp,
1096 	__in_bcount(size)	caddr_t data,
1097 	__in			size_t size,
1098 	__out			efx_vpd_value_t *evvp,
1099 	__inout			unsigned int *contp);
1100 
1101 LIBEFX_INTERNAL
1102 extern __checkReturn		efx_rc_t
1103 ef10_vpd_write(
1104 	__in			efx_nic_t *enp,
1105 	__in_bcount(size)	caddr_t data,
1106 	__in			size_t size);
1107 
1108 LIBEFX_INTERNAL
1109 extern				void
1110 ef10_vpd_fini(
1111 	__in			efx_nic_t *enp);
1112 
1113 #endif	/* EFSYS_OPT_VPD */
1114 
1115 
1116 /* RX */
1117 
1118 LIBEFX_INTERNAL
1119 extern	__checkReturn	efx_rc_t
1120 ef10_rx_init(
1121 	__in		efx_nic_t *enp);
1122 
1123 #if EFSYS_OPT_RX_SCATTER
1124 LIBEFX_INTERNAL
1125 extern	__checkReturn	efx_rc_t
1126 ef10_rx_scatter_enable(
1127 	__in		efx_nic_t *enp,
1128 	__in		unsigned int buf_size);
1129 #endif	/* EFSYS_OPT_RX_SCATTER */
1130 
1131 
1132 #if EFSYS_OPT_RX_SCALE
1133 
1134 LIBEFX_INTERNAL
1135 extern	__checkReturn	efx_rc_t
1136 ef10_rx_scale_context_alloc(
1137 	__in		efx_nic_t *enp,
1138 	__in		efx_rx_scale_context_type_t type,
1139 	__in		uint32_t num_queues,
1140 	__out		uint32_t *rss_contextp);
1141 
1142 LIBEFX_INTERNAL
1143 extern	__checkReturn	efx_rc_t
1144 ef10_rx_scale_context_free(
1145 	__in		efx_nic_t *enp,
1146 	__in		uint32_t rss_context);
1147 
1148 LIBEFX_INTERNAL
1149 extern	__checkReturn	efx_rc_t
1150 ef10_rx_scale_mode_set(
1151 	__in		efx_nic_t *enp,
1152 	__in		uint32_t rss_context,
1153 	__in		efx_rx_hash_alg_t alg,
1154 	__in		efx_rx_hash_type_t type,
1155 	__in		boolean_t insert);
1156 
1157 LIBEFX_INTERNAL
1158 extern	__checkReturn	efx_rc_t
1159 ef10_rx_scale_key_set(
1160 	__in		efx_nic_t *enp,
1161 	__in		uint32_t rss_context,
1162 	__in_ecount(n)	uint8_t *key,
1163 	__in		size_t n);
1164 
1165 LIBEFX_INTERNAL
1166 extern	__checkReturn	efx_rc_t
1167 ef10_rx_scale_tbl_set(
1168 	__in		efx_nic_t *enp,
1169 	__in		uint32_t rss_context,
1170 	__in_ecount(n)	unsigned int *table,
1171 	__in		size_t n);
1172 
1173 LIBEFX_INTERNAL
1174 extern	__checkReturn	uint32_t
1175 ef10_rx_prefix_hash(
1176 	__in		efx_nic_t *enp,
1177 	__in		efx_rx_hash_alg_t func,
1178 	__in		uint8_t *buffer);
1179 
1180 #endif /* EFSYS_OPT_RX_SCALE */
1181 
1182 LIBEFX_INTERNAL
1183 extern	__checkReturn	efx_rc_t
1184 ef10_rx_prefix_pktlen(
1185 	__in		efx_nic_t *enp,
1186 	__in		uint8_t *buffer,
1187 	__out		uint16_t *lengthp);
1188 
1189 LIBEFX_INTERNAL
1190 extern				void
1191 ef10_rx_qpost(
1192 	__in			efx_rxq_t *erp,
1193 	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
1194 	__in			size_t size,
1195 	__in			unsigned int ndescs,
1196 	__in			unsigned int completed,
1197 	__in			unsigned int added);
1198 
1199 LIBEFX_INTERNAL
1200 extern			void
1201 ef10_rx_qpush(
1202 	__in		efx_rxq_t *erp,
1203 	__in		unsigned int added,
1204 	__inout		unsigned int *pushedp);
1205 
1206 LIBEFX_INTERNAL
1207 extern	__checkReturn	efx_rc_t
1208 ef10_rx_qflush(
1209 	__in		efx_rxq_t *erp);
1210 
1211 LIBEFX_INTERNAL
1212 extern		void
1213 ef10_rx_qenable(
1214 	__in		efx_rxq_t *erp);
1215 
1216 union efx_rxq_type_data_u;
1217 
1218 LIBEFX_INTERNAL
1219 extern	__checkReturn	efx_rc_t
1220 ef10_rx_qcreate(
1221 	__in		efx_nic_t *enp,
1222 	__in		unsigned int index,
1223 	__in		unsigned int label,
1224 	__in		efx_rxq_type_t type,
1225 	__in_opt	const union efx_rxq_type_data_u *type_data,
1226 	__in		efsys_mem_t *esmp,
1227 	__in		size_t ndescs,
1228 	__in		uint32_t id,
1229 	__in		unsigned int flags,
1230 	__in		efx_evq_t *eep,
1231 	__in		efx_rxq_t *erp);
1232 
1233 LIBEFX_INTERNAL
1234 extern			void
1235 ef10_rx_qdestroy(
1236 	__in		efx_rxq_t *erp);
1237 
1238 LIBEFX_INTERNAL
1239 extern			void
1240 ef10_rx_fini(
1241 	__in		efx_nic_t *enp);
1242 
1243 #if EFSYS_OPT_FILTER
1244 
1245 enum efx_filter_replacement_policy_e;
1246 
1247 typedef struct ef10_filter_handle_s {
1248 	uint32_t	efh_lo;
1249 	uint32_t	efh_hi;
1250 } ef10_filter_handle_t;
1251 
1252 typedef struct ef10_filter_entry_s {
1253 	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
1254 	ef10_filter_handle_t efe_handle;
1255 } ef10_filter_entry_t;
1256 
1257 /*
1258  * BUSY flag indicates that an update is in progress.
1259  * AUTO_OLD flag is used to mark and sweep MAC packet filters.
1260  */
1261 #define	EFX_EF10_FILTER_FLAG_BUSY	1U
1262 #define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
1263 #define	EFX_EF10_FILTER_FLAGS		3U
1264 
1265 /*
1266  * Size of the hash table used by the driver. Doesn't need to be the
1267  * same size as the hardware's table.
1268  */
1269 #define	EFX_EF10_FILTER_TBL_ROWS 8192
1270 
1271 /* Only need to allow for one directed and one unknown unicast filter */
1272 #define	EFX_EF10_FILTER_UNICAST_FILTERS_MAX	2
1273 
1274 /* Allow for the broadcast address to be added to the multicast list */
1275 #define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
1276 
1277 /*
1278  * For encapsulated packets, there is one filter each for each combination of
1279  * IPv4 or IPv6 outer frame, VXLAN, GENEVE or NVGRE packet type, and unicast or
1280  * multicast inner frames.
1281  */
1282 #define	EFX_EF10_FILTER_ENCAP_FILTERS_MAX	12
1283 
1284 typedef struct ef10_filter_table_s {
1285 	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
1286 	efx_rxq_t		*eft_default_rxq;
1287 	boolean_t		eft_using_rss;
1288 	uint32_t		eft_unicst_filter_indexes[
1289 	    EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
1290 	uint32_t		eft_unicst_filter_count;
1291 	uint32_t		eft_mulcst_filter_indexes[
1292 	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
1293 	uint32_t		eft_mulcst_filter_count;
1294 	boolean_t		eft_using_all_mulcst;
1295 	uint32_t		eft_encap_filter_indexes[
1296 	    EFX_EF10_FILTER_ENCAP_FILTERS_MAX];
1297 	uint32_t		eft_encap_filter_count;
1298 } ef10_filter_table_t;
1299 
1300 LIBEFX_INTERNAL
1301 extern	__checkReturn	efx_rc_t
1302 ef10_filter_init(
1303 	__in		efx_nic_t *enp);
1304 
1305 LIBEFX_INTERNAL
1306 extern			void
1307 ef10_filter_fini(
1308 	__in		efx_nic_t *enp);
1309 
1310 LIBEFX_INTERNAL
1311 extern	__checkReturn	efx_rc_t
1312 ef10_filter_restore(
1313 	__in		efx_nic_t *enp);
1314 
1315 LIBEFX_INTERNAL
1316 extern	__checkReturn	efx_rc_t
1317 ef10_filter_add(
1318 	__in		efx_nic_t *enp,
1319 	__inout		efx_filter_spec_t *spec,
1320 	__in		enum efx_filter_replacement_policy_e policy);
1321 
1322 LIBEFX_INTERNAL
1323 extern	__checkReturn	efx_rc_t
1324 ef10_filter_delete(
1325 	__in		efx_nic_t *enp,
1326 	__inout		efx_filter_spec_t *spec);
1327 
1328 LIBEFX_INTERNAL
1329 extern	__checkReturn	efx_rc_t
1330 ef10_filter_supported_filters(
1331 	__in				efx_nic_t *enp,
1332 	__out_ecount(buffer_length)	uint32_t *buffer,
1333 	__in				size_t buffer_length,
1334 	__out				size_t *list_lengthp);
1335 
1336 LIBEFX_INTERNAL
1337 extern	__checkReturn	efx_rc_t
1338 ef10_filter_reconfigure(
1339 	__in				efx_nic_t *enp,
1340 	__in_ecount(6)			uint8_t const *mac_addr,
1341 	__in				boolean_t all_unicst,
1342 	__in				boolean_t mulcst,
1343 	__in				boolean_t all_mulcst,
1344 	__in				boolean_t brdcst,
1345 	__in_ecount(6*count)		uint8_t const *addrs,
1346 	__in				uint32_t count);
1347 
1348 LIBEFX_INTERNAL
1349 extern		void
1350 ef10_filter_get_default_rxq(
1351 	__in		efx_nic_t *enp,
1352 	__out		efx_rxq_t **erpp,
1353 	__out		boolean_t *using_rss);
1354 
1355 LIBEFX_INTERNAL
1356 extern		void
1357 ef10_filter_default_rxq_set(
1358 	__in		efx_nic_t *enp,
1359 	__in		efx_rxq_t *erp,
1360 	__in		boolean_t using_rss);
1361 
1362 LIBEFX_INTERNAL
1363 extern		void
1364 ef10_filter_default_rxq_clear(
1365 	__in		efx_nic_t *enp);
1366 
1367 
1368 #endif /* EFSYS_OPT_FILTER */
1369 
1370 LIBEFX_INTERNAL
1371 extern	__checkReturn			efx_rc_t
1372 efx_mcdi_get_function_info(
1373 	__in				efx_nic_t *enp,
1374 	__out				uint32_t *pfp,
1375 	__out_opt			uint32_t *vfp,
1376 	__out_opt			efx_pcie_interface_t *intfp);
1377 
1378 LIBEFX_INTERNAL
1379 extern	__checkReturn		efx_rc_t
1380 efx_mcdi_privilege_mask(
1381 	__in			efx_nic_t *enp,
1382 	__in			uint32_t pf,
1383 	__in			uint32_t vf,
1384 	__out			uint32_t *maskp);
1385 
1386 LIBEFX_INTERNAL
1387 extern	__checkReturn	efx_rc_t
1388 efx_mcdi_get_port_assignment(
1389 	__in		efx_nic_t *enp,
1390 	__out		uint32_t *portp);
1391 
1392 LIBEFX_INTERNAL
1393 extern	__checkReturn	efx_rc_t
1394 efx_mcdi_get_port_modes(
1395 	__in		efx_nic_t *enp,
1396 	__out		uint32_t *modesp,
1397 	__out_opt	uint32_t *current_modep,
1398 	__out_opt	uint32_t *default_modep);
1399 
1400 LIBEFX_INTERNAL
1401 extern	__checkReturn	efx_rc_t
1402 ef10_nic_get_port_mode_bandwidth(
1403 	__in		efx_nic_t *enp,
1404 	__out		uint32_t *bandwidth_mbpsp);
1405 
1406 LIBEFX_INTERNAL
1407 extern	__checkReturn	efx_rc_t
1408 efx_mcdi_get_mac_address_pf(
1409 	__in			efx_nic_t *enp,
1410 	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1411 
1412 LIBEFX_INTERNAL
1413 extern	__checkReturn	efx_rc_t
1414 efx_mcdi_get_mac_address_vf(
1415 	__in			efx_nic_t *enp,
1416 	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1417 
1418 LIBEFX_INTERNAL
1419 extern	__checkReturn	efx_rc_t
1420 efx_mcdi_get_clock(
1421 	__in		efx_nic_t *enp,
1422 	__out		uint32_t *sys_freqp,
1423 	__out		uint32_t *dpcpu_freqp);
1424 
1425 
1426 LIBEFX_INTERNAL
1427 extern	__checkReturn	efx_rc_t
1428 efx_mcdi_get_rxdp_config(
1429 	__in		efx_nic_t *enp,
1430 	__out		uint32_t *end_paddingp);
1431 
1432 LIBEFX_INTERNAL
1433 extern	__checkReturn	efx_rc_t
1434 efx_mcdi_get_vector_cfg(
1435 	__in		efx_nic_t *enp,
1436 	__out_opt	uint32_t *vec_basep,
1437 	__out_opt	uint32_t *pf_nvecp,
1438 	__out_opt	uint32_t *vf_nvecp);
1439 
1440 LIBEFX_INTERNAL
1441 extern	__checkReturn	efx_rc_t
1442 efx_mcdi_alloc_vis(
1443 	__in		efx_nic_t *enp,
1444 	__in		uint32_t min_vi_count,
1445 	__in		uint32_t max_vi_count,
1446 	__out		uint32_t *vi_basep,
1447 	__out		uint32_t *vi_countp,
1448 	__out		uint32_t *vi_shiftp);
1449 
1450 LIBEFX_INTERNAL
1451 extern	__checkReturn	efx_rc_t
1452 efx_mcdi_free_vis(
1453 	__in		efx_nic_t *enp);
1454 
1455 LIBEFX_INTERNAL
1456 extern	__checkReturn		efx_rc_t
1457 ef10_get_privilege_mask(
1458 	__in			efx_nic_t *enp,
1459 	__out			uint32_t *maskp);
1460 
1461 LIBEFX_INTERNAL
1462 extern	__checkReturn	efx_rc_t
1463 efx_mcdi_nic_board_cfg(
1464 	__in		efx_nic_t *enp);
1465 
1466 LIBEFX_INTERNAL
1467 extern	__checkReturn	efx_rc_t
1468 efx_mcdi_entity_reset(
1469 	__in		efx_nic_t *enp);
1470 
1471 #if EFSYS_OPT_FW_SUBVARIANT_AWARE
1472 
1473 LIBEFX_INTERNAL
1474 extern	__checkReturn	efx_rc_t
1475 efx_mcdi_get_nic_global(
1476 	__in		efx_nic_t *enp,
1477 	__in		uint32_t key,
1478 	__out		uint32_t *valuep);
1479 
1480 LIBEFX_INTERNAL
1481 extern	__checkReturn	efx_rc_t
1482 efx_mcdi_set_nic_global(
1483 	__in		efx_nic_t *enp,
1484 	__in		uint32_t key,
1485 	__in		uint32_t value);
1486 
1487 #endif	/* EFSYS_OPT_FW_SUBVARIANT_AWARE */
1488 
1489 #if EFSYS_OPT_EVB
1490 LIBEFX_INTERNAL
1491 extern	__checkReturn	efx_rc_t
1492 ef10_evb_init(
1493 	__in		efx_nic_t *enp);
1494 
1495 LIBEFX_INTERNAL
1496 extern			void
1497 ef10_evb_fini(
1498 	__in		efx_nic_t *enp);
1499 
1500 LIBEFX_INTERNAL
1501 extern	__checkReturn	efx_rc_t
1502 ef10_evb_vswitch_alloc(
1503 	__in		efx_nic_t *enp,
1504 	__out		efx_vswitch_id_t *vswitch_idp);
1505 
1506 
1507 LIBEFX_INTERNAL
1508 extern	__checkReturn	efx_rc_t
1509 ef10_evb_vswitch_free(
1510 	__in		efx_nic_t *enp,
1511 	__in		efx_vswitch_id_t vswitch_id);
1512 
1513 LIBEFX_INTERNAL
1514 extern	__checkReturn	efx_rc_t
1515 ef10_evb_vport_alloc(
1516 	__in		efx_nic_t *enp,
1517 	__in		efx_vswitch_id_t vswitch_id,
1518 	__in		efx_vport_type_t vport_type,
1519 	__in		uint16_t vid,
1520 	__in		boolean_t vlan_restrict,
1521 	__out		efx_vport_id_t *vport_idp);
1522 
1523 
1524 LIBEFX_INTERNAL
1525 extern	__checkReturn	efx_rc_t
1526 ef10_evb_vport_free(
1527 	__in		efx_nic_t *enp,
1528 	__in		efx_vswitch_id_t vswitch_id,
1529 	__in		efx_vport_id_t vport_id);
1530 
1531 LIBEFX_INTERNAL
1532 extern	__checkReturn	efx_rc_t
1533 ef10_evb_vport_mac_addr_add(
1534 	__in		efx_nic_t *enp,
1535 	__in		efx_vswitch_id_t vswitch_id,
1536 	__in		efx_vport_id_t vport_id,
1537 	__in_ecount(6)	uint8_t *addrp);
1538 
1539 LIBEFX_INTERNAL
1540 extern	__checkReturn	efx_rc_t
1541 ef10_evb_vport_mac_addr_del(
1542 	__in		efx_nic_t *enp,
1543 	__in		efx_vswitch_id_t vswitch_id,
1544 	__in		efx_vport_id_t vport_id,
1545 	__in_ecount(6)	uint8_t *addrp);
1546 
1547 LIBEFX_INTERNAL
1548 extern	__checkReturn	efx_rc_t
1549 ef10_evb_vadaptor_alloc(
1550 	__in		efx_nic_t *enp,
1551 	__in		efx_vswitch_id_t vswitch_id,
1552 	__in		efx_vport_id_t vport_id);
1553 
1554 
1555 LIBEFX_INTERNAL
1556 extern __checkReturn	efx_rc_t
1557 ef10_evb_vadaptor_free(
1558 	__in		efx_nic_t *enp,
1559 	__in		efx_vswitch_id_t vswitch_id,
1560 	__in		efx_vport_id_t vport_id);
1561 
1562 LIBEFX_INTERNAL
1563 extern	__checkReturn	efx_rc_t
1564 ef10_evb_vport_assign(
1565 	__in		efx_nic_t *enp,
1566 	__in		efx_vswitch_id_t vswitch_id,
1567 	__in		efx_vport_id_t vport_id,
1568 	__in		uint32_t vf_index);
1569 
1570 LIBEFX_INTERNAL
1571 extern	__checkReturn				efx_rc_t
1572 ef10_evb_vport_reconfigure(
1573 	__in					efx_nic_t *enp,
1574 	__in					efx_vswitch_id_t vswitch_id,
1575 	__in					efx_vport_id_t vport_id,
1576 	__in_opt				uint16_t *vidp,
1577 	__in_bcount_opt(EFX_MAC_ADDR_LEN)	uint8_t *addrp,
1578 	__out_opt				boolean_t *fn_resetp);
1579 
1580 LIBEFX_INTERNAL
1581 extern	__checkReturn	efx_rc_t
1582 ef10_evb_vport_stats(
1583 	__in		efx_nic_t *enp,
1584 	__in		efx_vswitch_id_t vswitch_id,
1585 	__in		efx_vport_id_t vport_id,
1586 	__out		efsys_mem_t *esmp);
1587 
1588 #endif  /* EFSYS_OPT_EVB */
1589 
1590 #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER
1591 LIBEFX_INTERNAL
1592 extern	__checkReturn	efx_rc_t
1593 ef10_proxy_auth_init(
1594 	__in		efx_nic_t *enp);
1595 
1596 LIBEFX_INTERNAL
1597 extern			void
1598 ef10_proxy_auth_fini(
1599 	__in		efx_nic_t *enp);
1600 
1601 LIBEFX_INTERNAL
1602 extern	__checkReturn		efx_rc_t
1603 ef10_proxy_auth_mc_config(
1604 	__in			efx_nic_t *enp,
1605 	__in			efsys_mem_t *request_bufferp,
1606 	__in			efsys_mem_t *response_bufferp,
1607 	__in			efsys_mem_t *status_bufferp,
1608 	__in			uint32_t block_cnt,
1609 	__in_ecount(op_count)	uint32_t *op_listp,
1610 	__in			size_t op_count);
1611 
1612 LIBEFX_INTERNAL
1613 extern	__checkReturn	efx_rc_t
1614 ef10_proxy_auth_disable(
1615 	__in		efx_nic_t *enp);
1616 
1617 LIBEFX_INTERNAL
1618 extern	__checkReturn	efx_rc_t
1619 ef10_proxy_auth_privilege_modify(
1620 	__in		efx_nic_t *enp,
1621 	__in		uint32_t fn_group,
1622 	__in		uint32_t pf_index,
1623 	__in		uint32_t vf_index,
1624 	__in		uint32_t add_privileges_mask,
1625 	__in		uint32_t remove_privileges_mask);
1626 
1627 LIBEFX_INTERNAL
1628 extern	__checkReturn	efx_rc_t
1629 ef10_proxy_auth_set_privilege_mask(
1630 	__in		efx_nic_t *enp,
1631 	__in		uint32_t vf_index,
1632 	__in		uint32_t mask,
1633 	__in		uint32_t value);
1634 
1635 LIBEFX_INTERNAL
1636 extern	__checkReturn	efx_rc_t
1637 ef10_proxy_auth_complete_request(
1638 	__in		efx_nic_t *enp,
1639 	__in		uint32_t fn_index,
1640 	__in		uint32_t proxy_result,
1641 	__in		uint32_t handle);
1642 
1643 LIBEFX_INTERNAL
1644 extern	__checkReturn	efx_rc_t
1645 ef10_proxy_auth_exec_cmd(
1646 	__in		efx_nic_t *enp,
1647 	__inout		efx_proxy_cmd_params_t *paramsp);
1648 
1649 LIBEFX_INTERNAL
1650 extern	__checkReturn	efx_rc_t
1651 ef10_proxy_auth_get_privilege_mask(
1652 	__in		efx_nic_t *enp,
1653 	__in		uint32_t pf_index,
1654 	__in		uint32_t vf_index,
1655 	__out		uint32_t *maskp);
1656 
1657 #endif  /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */
1658 
1659 #if EFSYS_OPT_RX_PACKED_STREAM
1660 
1661 /* Data space per credit in packed stream mode */
1662 #define	EFX_RX_PACKED_STREAM_MEM_PER_CREDIT (1 << 16)
1663 
1664 /*
1665  * Received packets are always aligned at this boundary. Also there always
1666  * exists a gap of this size between packets.
1667  * (see SF-112241-TC, 4.5)
1668  */
1669 #define	EFX_RX_PACKED_STREAM_ALIGNMENT 64
1670 
1671 /*
1672  * Size of a pseudo-header prepended to received packets
1673  * in packed stream mode
1674  */
1675 #define	EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE 8
1676 
1677 /* Minimum space for packet in packed stream mode */
1678 #define	EFX_RX_PACKED_STREAM_MIN_PACKET_SPACE		\
1679 	EFX_P2ROUNDUP(size_t,				\
1680 	    EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE +	\
1681 	    EFX_MAC_PDU_MIN +				\
1682 	    EFX_RX_PACKED_STREAM_ALIGNMENT,		\
1683 	    EFX_RX_PACKED_STREAM_ALIGNMENT)
1684 
1685 /* Maximum number of credits */
1686 #define	EFX_RX_PACKED_STREAM_MAX_CREDITS 127
1687 
1688 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
1689 
1690 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
1691 
1692 /*
1693  * Maximum DMA length and buffer stride alignment.
1694  * (see SF-119419-TC, 3.2)
1695  */
1696 #define	EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT	64
1697 
1698 #endif
1699 
1700 #ifdef	__cplusplus
1701 }
1702 #endif
1703 
1704 #endif	/* _SYS_EF10_IMPL_H */
1705