xref: /freebsd/sys/dev/sfxge/common/hunt_impl.h (revision 5abce2b9194ac1afcc3e7eb0671a6c209e75cfab)
1 /*-
2  * Copyright (c) 2012-2015 Solarflare Communications Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * The views and conclusions contained in the software and documentation are
27  * those of the authors and should not be interpreted as representing official
28  * policies, either expressed or implied, of the FreeBSD Project.
29  *
30  * $FreeBSD$
31  */
32 
33 #ifndef _SYS_HUNT_IMPL_H
34 #define	_SYS_HUNT_IMPL_H
35 
36 #include "efx.h"
37 #include "efx_regs.h"
38 #include "efx_regs_ef10.h"
39 #include "efx_mcdi.h"
40 
41 #ifdef	__cplusplus
42 extern "C" {
43 #endif
44 
45 /*
46  * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could
47  * possibly be increased, or the write size reported by newer firmware used
48  * instead.
49  */
50 #define	EF10_NVRAM_CHUNK 0x80
51 
52 /* Alignment requirement for value written to RX WPTR:
53  *  the WPTR must be aligned to an 8 descriptor boundary
54  */
55 #define	EF10_RX_WPTR_ALIGN 8
56 
57 /*
58  * Max byte offset into the packet the TCP header must start for the hardware
59  * to be able to parse the packet correctly.
60  * FIXME: Move to ef10_impl.h when it is included in all driver builds.
61  */
62 #define	EF10_TCP_HEADER_OFFSET_LIMIT	208
63 
64 /* Invalid RSS context handle */
65 #define	EF10_RSS_CONTEXT_INVALID	(0xffffffff)
66 
67 
68 /* EV */
69 
70 	__checkReturn	efx_rc_t
71 ef10_ev_init(
72 	__in		efx_nic_t *enp);
73 
74 			void
75 ef10_ev_fini(
76 	__in		efx_nic_t *enp);
77 
78 	__checkReturn	efx_rc_t
79 ef10_ev_qcreate(
80 	__in		efx_nic_t *enp,
81 	__in		unsigned int index,
82 	__in		efsys_mem_t *esmp,
83 	__in		size_t n,
84 	__in		uint32_t id,
85 	__in		efx_evq_t *eep);
86 
87 			void
88 ef10_ev_qdestroy(
89 	__in		efx_evq_t *eep);
90 
91 	__checkReturn	efx_rc_t
92 ef10_ev_qprime(
93 	__in		efx_evq_t *eep,
94 	__in		unsigned int count);
95 
96 			void
97 ef10_ev_qpost(
98 	__in	efx_evq_t *eep,
99 	__in	uint16_t data);
100 
101 	__checkReturn	efx_rc_t
102 ef10_ev_qmoderate(
103 	__in		efx_evq_t *eep,
104 	__in		unsigned int us);
105 
106 #if EFSYS_OPT_QSTATS
107 			void
108 ef10_ev_qstats_update(
109 	__in				efx_evq_t *eep,
110 	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
111 #endif /* EFSYS_OPT_QSTATS */
112 
113 		void
114 ef10_ev_rxlabel_init(
115 	__in		efx_evq_t *eep,
116 	__in		efx_rxq_t *erp,
117 	__in		unsigned int label);
118 
119 		void
120 ef10_ev_rxlabel_fini(
121 	__in		efx_evq_t *eep,
122 	__in		unsigned int label);
123 
124 /* INTR */
125 
126 	__checkReturn	efx_rc_t
127 ef10_intr_init(
128 	__in		efx_nic_t *enp,
129 	__in		efx_intr_type_t type,
130 	__in		efsys_mem_t *esmp);
131 
132 			void
133 ef10_intr_enable(
134 	__in		efx_nic_t *enp);
135 
136 			void
137 ef10_intr_disable(
138 	__in		efx_nic_t *enp);
139 
140 			void
141 ef10_intr_disable_unlocked(
142 	__in		efx_nic_t *enp);
143 
144 	__checkReturn	efx_rc_t
145 ef10_intr_trigger(
146 	__in		efx_nic_t *enp,
147 	__in		unsigned int level);
148 
149 			void
150 ef10_intr_status_line(
151 	__in		efx_nic_t *enp,
152 	__out		boolean_t *fatalp,
153 	__out		uint32_t *qmaskp);
154 
155 			void
156 ef10_intr_status_message(
157 	__in		efx_nic_t *enp,
158 	__in		unsigned int message,
159 	__out		boolean_t *fatalp);
160 
161 			void
162 ef10_intr_fatal(
163 	__in		efx_nic_t *enp);
164 			void
165 ef10_intr_fini(
166 	__in		efx_nic_t *enp);
167 
168 /* NIC */
169 
170 extern	__checkReturn	efx_rc_t
171 ef10_nic_probe(
172 	__in		efx_nic_t *enp);
173 
174 extern	__checkReturn	efx_rc_t
175 hunt_board_cfg(
176 	__in		efx_nic_t *enp);
177 
178 extern	__checkReturn	efx_rc_t
179 ef10_nic_set_drv_limits(
180 	__inout		efx_nic_t *enp,
181 	__in		efx_drv_limits_t *edlp);
182 
183 extern	__checkReturn	efx_rc_t
184 ef10_nic_get_vi_pool(
185 	__in		efx_nic_t *enp,
186 	__out		uint32_t *vi_countp);
187 
188 extern	__checkReturn	efx_rc_t
189 ef10_nic_get_bar_region(
190 	__in		efx_nic_t *enp,
191 	__in		efx_nic_region_t region,
192 	__out		uint32_t *offsetp,
193 	__out		size_t *sizep);
194 
195 extern	__checkReturn	efx_rc_t
196 ef10_nic_reset(
197 	__in		efx_nic_t *enp);
198 
199 extern	__checkReturn	efx_rc_t
200 ef10_nic_init(
201 	__in		efx_nic_t *enp);
202 
203 #if EFSYS_OPT_DIAG
204 
205 extern	__checkReturn	efx_rc_t
206 ef10_nic_register_test(
207 	__in		efx_nic_t *enp);
208 
209 #endif	/* EFSYS_OPT_DIAG */
210 
211 extern			void
212 ef10_nic_fini(
213 	__in		efx_nic_t *enp);
214 
215 extern			void
216 ef10_nic_unprobe(
217 	__in		efx_nic_t *enp);
218 
219 
220 /* MAC */
221 
222 extern	__checkReturn	efx_rc_t
223 ef10_mac_poll(
224 	__in		efx_nic_t *enp,
225 	__out		efx_link_mode_t *link_modep);
226 
227 extern	__checkReturn	efx_rc_t
228 ef10_mac_up(
229 	__in		efx_nic_t *enp,
230 	__out		boolean_t *mac_upp);
231 
232 extern	__checkReturn	efx_rc_t
233 ef10_mac_addr_set(
234 	__in	efx_nic_t *enp);
235 
236 extern	__checkReturn	efx_rc_t
237 ef10_mac_pdu_set(
238 	__in	efx_nic_t *enp);
239 
240 extern	__checkReturn	efx_rc_t
241 ef10_mac_reconfigure(
242 	__in	efx_nic_t *enp);
243 
244 extern	__checkReturn	efx_rc_t
245 ef10_mac_multicast_list_set(
246 	__in				efx_nic_t *enp);
247 
248 extern	__checkReturn	efx_rc_t
249 ef10_mac_filter_default_rxq_set(
250 	__in		efx_nic_t *enp,
251 	__in		efx_rxq_t *erp,
252 	__in		boolean_t using_rss);
253 
254 extern			void
255 ef10_mac_filter_default_rxq_clear(
256 	__in		efx_nic_t *enp);
257 
258 #if EFSYS_OPT_LOOPBACK
259 
260 extern	__checkReturn	efx_rc_t
261 ef10_mac_loopback_set(
262 	__in		efx_nic_t *enp,
263 	__in		efx_link_mode_t link_mode,
264 	__in		efx_loopback_type_t loopback_type);
265 
266 #endif	/* EFSYS_OPT_LOOPBACK */
267 
268 #if EFSYS_OPT_MAC_STATS
269 
270 extern	__checkReturn			efx_rc_t
271 ef10_mac_stats_update(
272 	__in				efx_nic_t *enp,
273 	__in				efsys_mem_t *esmp,
274 	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
275 	__inout_opt			uint32_t *generationp);
276 
277 #endif	/* EFSYS_OPT_MAC_STATS */
278 
279 
280 /* MCDI */
281 
282 #if EFSYS_OPT_MCDI
283 
284 extern	__checkReturn	efx_rc_t
285 ef10_mcdi_init(
286 	__in		efx_nic_t *enp,
287 	__in		const efx_mcdi_transport_t *mtp);
288 
289 extern			void
290 ef10_mcdi_fini(
291 	__in		efx_nic_t *enp);
292 
293 extern			void
294 ef10_mcdi_send_request(
295 	__in		efx_nic_t *enp,
296 	__in		void *hdrp,
297 	__in		size_t hdr_len,
298 	__in		void *sdup,
299 	__in		size_t sdu_len);
300 
301 extern	__checkReturn	boolean_t
302 ef10_mcdi_poll_response(
303 	__in		efx_nic_t *enp);
304 
305 extern			void
306 ef10_mcdi_read_response(
307 	__in			efx_nic_t *enp,
308 	__out_bcount(length)	void *bufferp,
309 	__in			size_t offset,
310 	__in			size_t length);
311 
312 extern			efx_rc_t
313 ef10_mcdi_poll_reboot(
314 	__in		efx_nic_t *enp);
315 
316 extern	__checkReturn	efx_rc_t
317 ef10_mcdi_feature_supported(
318 	__in		efx_nic_t *enp,
319 	__in		efx_mcdi_feature_id_t id,
320 	__out		boolean_t *supportedp);
321 
322 #endif /* EFSYS_OPT_MCDI */
323 
324 /* NVRAM */
325 
326 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
327 
328 extern	__checkReturn		efx_rc_t
329 ef10_nvram_buf_read_tlv(
330 	__in				efx_nic_t *enp,
331 	__in_bcount(max_seg_size)	caddr_t seg_data,
332 	__in				size_t max_seg_size,
333 	__in				uint32_t tag,
334 	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
335 	__out				size_t *sizep);
336 
337 extern	__checkReturn		efx_rc_t
338 ef10_nvram_buf_write_tlv(
339 	__inout_bcount(partn_size)	caddr_t partn_data,
340 	__in				size_t partn_size,
341 	__in				uint32_t tag,
342 	__in_bcount(tag_size)		caddr_t tag_data,
343 	__in				size_t tag_size,
344 	__out				size_t *total_lengthp);
345 
346 extern	__checkReturn		efx_rc_t
347 ef10_nvram_partn_read_tlv(
348 	__in				efx_nic_t *enp,
349 	__in				uint32_t partn,
350 	__in				uint32_t tag,
351 	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
352 	__out				size_t *sizep);
353 
354 extern	__checkReturn		efx_rc_t
355 ef10_nvram_partn_write_tlv(
356 	__in		   	efx_nic_t *enp,
357 	__in		    	uint32_t partn,
358 	__in		     	uint32_t tag,
359 	__in_bcount(size)	caddr_t data,
360 	__in			size_t size);
361 
362 extern	__checkReturn		efx_rc_t
363 ef10_nvram_partn_write_segment_tlv(
364 	__in			efx_nic_t *enp,
365 	__in			uint32_t partn,
366 	__in			uint32_t tag,
367 	__in_bcount(size)	caddr_t data,
368 	__in			size_t size,
369 	__in			boolean_t all_segments);
370 
371 extern	__checkReturn		efx_rc_t
372 ef10_nvram_partn_lock(
373 	__in			efx_nic_t *enp,
374 	__in			uint32_t partn);
375 
376 extern				void
377 ef10_nvram_partn_unlock(
378 	__in			efx_nic_t *enp,
379 	__in			uint32_t partn);
380 
381 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
382 
383 #if EFSYS_OPT_NVRAM
384 
385 #if EFSYS_OPT_DIAG
386 
387 extern	__checkReturn		efx_rc_t
388 ef10_nvram_test(
389 	__in			efx_nic_t *enp);
390 
391 #endif	/* EFSYS_OPT_DIAG */
392 
393 extern	__checkReturn		efx_rc_t
394 ef10_nvram_type_to_partn(
395 	__in			efx_nic_t *enp,
396 	__in			efx_nvram_type_t type,
397 	__out			uint32_t *partnp);
398 
399 extern	__checkReturn		efx_rc_t
400 ef10_nvram_partn_size(
401 	__in			efx_nic_t *enp,
402 	__in			uint32_t partn,
403 	__out			size_t *sizep);
404 
405 extern	__checkReturn		efx_rc_t
406 ef10_nvram_partn_rw_start(
407 	__in			efx_nic_t *enp,
408 	__in			uint32_t partn,
409 	__out			size_t *chunk_sizep);
410 
411 extern	__checkReturn		efx_rc_t
412 ef10_nvram_partn_read_mode(
413 	__in			efx_nic_t *enp,
414 	__in			uint32_t partn,
415 	__in			unsigned int offset,
416 	__out_bcount(size)	caddr_t data,
417 	__in			size_t size,
418 	__in			uint32_t mode);
419 
420 extern	__checkReturn		efx_rc_t
421 ef10_nvram_partn_read(
422 	__in			efx_nic_t *enp,
423 	__in			uint32_t partn,
424 	__in			unsigned int offset,
425 	__out_bcount(size)	caddr_t data,
426 	__in			size_t size);
427 
428 extern	__checkReturn		efx_rc_t
429 ef10_nvram_partn_erase(
430 	__in			efx_nic_t *enp,
431 	__in			uint32_t partn,
432 	__in			unsigned int offset,
433 	__in			size_t size);
434 
435 extern	__checkReturn		efx_rc_t
436 ef10_nvram_partn_write(
437 	__in			efx_nic_t *enp,
438 	__in			uint32_t partn,
439 	__in			unsigned int offset,
440 	__out_bcount(size)	caddr_t data,
441 	__in			size_t size);
442 
443 extern				void
444 ef10_nvram_partn_rw_finish(
445 	__in			efx_nic_t *enp,
446 	__in			uint32_t partn);
447 
448 extern	__checkReturn		efx_rc_t
449 ef10_nvram_partn_get_version(
450 	__in			efx_nic_t *enp,
451 	__in			uint32_t partn,
452 	__out			uint32_t *subtypep,
453 	__out_ecount(4)		uint16_t version[4]);
454 
455 extern	__checkReturn		efx_rc_t
456 ef10_nvram_partn_set_version(
457 	__in			efx_nic_t *enp,
458 	__in			uint32_t partn,
459 	__in_ecount(4)		uint16_t version[4]);
460 
461 extern	__checkReturn		efx_rc_t
462 ef10_nvram_buffer_validate(
463 	__in			efx_nic_t *enp,
464 	__in			uint32_t partn,
465 	__in_bcount(buffer_size)
466 				caddr_t bufferp,
467 	__in			size_t buffer_size);
468 
469 #endif	/* EFSYS_OPT_NVRAM */
470 
471 
472 /* PHY */
473 
474 typedef struct ef10_link_state_s {
475 	uint32_t		els_adv_cap_mask;
476 	uint32_t		els_lp_cap_mask;
477 	unsigned int		els_fcntl;
478 	efx_link_mode_t		els_link_mode;
479 #if EFSYS_OPT_LOOPBACK
480 	efx_loopback_type_t	els_loopback;
481 #endif
482 	boolean_t		els_mac_up;
483 } ef10_link_state_t;
484 
485 extern			void
486 ef10_phy_link_ev(
487 	__in		efx_nic_t *enp,
488 	__in		efx_qword_t *eqp,
489 	__out		efx_link_mode_t *link_modep);
490 
491 extern	__checkReturn	efx_rc_t
492 ef10_phy_get_link(
493 	__in		efx_nic_t *enp,
494 	__out		ef10_link_state_t *elsp);
495 
496 extern	__checkReturn	efx_rc_t
497 ef10_phy_power(
498 	__in		efx_nic_t *enp,
499 	__in		boolean_t on);
500 
501 extern	__checkReturn	efx_rc_t
502 ef10_phy_reconfigure(
503 	__in		efx_nic_t *enp);
504 
505 extern	__checkReturn	efx_rc_t
506 ef10_phy_verify(
507 	__in		efx_nic_t *enp);
508 
509 extern	__checkReturn	efx_rc_t
510 ef10_phy_oui_get(
511 	__in		efx_nic_t *enp,
512 	__out		uint32_t *ouip);
513 
514 #if EFSYS_OPT_PHY_STATS
515 
516 extern	__checkReturn			efx_rc_t
517 ef10_phy_stats_update(
518 	__in				efx_nic_t *enp,
519 	__in				efsys_mem_t *esmp,
520 	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
521 
522 #endif	/* EFSYS_OPT_PHY_STATS */
523 
524 #if EFSYS_OPT_PHY_PROPS
525 
526 #if EFSYS_OPT_NAMES
527 
528 extern		const char *
529 ef10_phy_prop_name(
530 	__in	efx_nic_t *enp,
531 	__in	unsigned int id);
532 
533 #endif	/* EFSYS_OPT_NAMES */
534 
535 extern	__checkReturn	efx_rc_t
536 ef10_phy_prop_get(
537 	__in		efx_nic_t *enp,
538 	__in		unsigned int id,
539 	__in		uint32_t flags,
540 	__out		uint32_t *valp);
541 
542 extern	__checkReturn	efx_rc_t
543 ef10_phy_prop_set(
544 	__in		efx_nic_t *enp,
545 	__in		unsigned int id,
546 	__in		uint32_t val);
547 
548 #endif	/* EFSYS_OPT_PHY_PROPS */
549 
550 #if EFSYS_OPT_BIST
551 
552 extern	__checkReturn		efx_rc_t
553 hunt_bist_enable_offline(
554 	__in			efx_nic_t *enp);
555 
556 extern	__checkReturn		efx_rc_t
557 hunt_bist_start(
558 	__in			efx_nic_t *enp,
559 	__in			efx_bist_type_t type);
560 
561 extern	__checkReturn		efx_rc_t
562 hunt_bist_poll(
563 	__in			efx_nic_t *enp,
564 	__in			efx_bist_type_t type,
565 	__out			efx_bist_result_t *resultp,
566 	__out_opt __drv_when(count > 0, __notnull)
567 	uint32_t 	*value_maskp,
568 	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
569 	unsigned long	*valuesp,
570 	__in			size_t count);
571 
572 extern				void
573 hunt_bist_stop(
574 	__in			efx_nic_t *enp,
575 	__in			efx_bist_type_t type);
576 
577 #endif	/* EFSYS_OPT_BIST */
578 
579 
580 /* SRAM */
581 
582 #if EFSYS_OPT_DIAG
583 
584 extern	__checkReturn	efx_rc_t
585 ef10_sram_test(
586 	__in		efx_nic_t *enp,
587 	__in		efx_sram_pattern_fn_t func);
588 
589 #endif	/* EFSYS_OPT_DIAG */
590 
591 
592 /* TX */
593 
594 extern	__checkReturn	efx_rc_t
595 ef10_tx_init(
596 	__in		efx_nic_t *enp);
597 
598 extern			void
599 ef10_tx_fini(
600 	__in		efx_nic_t *enp);
601 
602 extern	__checkReturn	efx_rc_t
603 ef10_tx_qcreate(
604 	__in		efx_nic_t *enp,
605 	__in		unsigned int index,
606 	__in		unsigned int label,
607 	__in		efsys_mem_t *esmp,
608 	__in		size_t n,
609 	__in		uint32_t id,
610 	__in		uint16_t flags,
611 	__in		efx_evq_t *eep,
612 	__in		efx_txq_t *etp,
613 	__out		unsigned int *addedp);
614 
615 extern		void
616 ef10_tx_qdestroy(
617 	__in		efx_txq_t *etp);
618 
619 extern	__checkReturn	efx_rc_t
620 ef10_tx_qpost(
621 	__in		efx_txq_t *etp,
622 	__in_ecount(n)	efx_buffer_t *eb,
623 	__in		unsigned int n,
624 	__in		unsigned int completed,
625 	__inout		unsigned int *addedp);
626 
627 extern			void
628 ef10_tx_qpush(
629 	__in		efx_txq_t *etp,
630 	__in		unsigned int added,
631 	__in		unsigned int pushed);
632 
633 extern	__checkReturn	efx_rc_t
634 ef10_tx_qpace(
635 	__in		efx_txq_t *etp,
636 	__in		unsigned int ns);
637 
638 extern	__checkReturn	efx_rc_t
639 ef10_tx_qflush(
640 	__in		efx_txq_t *etp);
641 
642 extern			void
643 ef10_tx_qenable(
644 	__in		efx_txq_t *etp);
645 
646 extern	__checkReturn	efx_rc_t
647 ef10_tx_qpio_enable(
648 	__in		efx_txq_t *etp);
649 
650 extern			void
651 ef10_tx_qpio_disable(
652 	__in		efx_txq_t *etp);
653 
654 extern	__checkReturn	efx_rc_t
655 ef10_tx_qpio_write(
656 	__in			efx_txq_t *etp,
657 	__in_ecount(buf_length)	uint8_t *buffer,
658 	__in			size_t buf_length,
659 	__in                    size_t pio_buf_offset);
660 
661 extern	__checkReturn	efx_rc_t
662 ef10_tx_qpio_post(
663 	__in			efx_txq_t *etp,
664 	__in			size_t pkt_length,
665 	__in			unsigned int completed,
666 	__inout			unsigned int *addedp);
667 
668 extern	__checkReturn	efx_rc_t
669 ef10_tx_qdesc_post(
670 	__in		efx_txq_t *etp,
671 	__in_ecount(n)	efx_desc_t *ed,
672 	__in		unsigned int n,
673 	__in		unsigned int completed,
674 	__inout		unsigned int *addedp);
675 
676 extern	void
677 ef10_tx_qdesc_dma_create(
678 	__in	efx_txq_t *etp,
679 	__in	efsys_dma_addr_t addr,
680 	__in	size_t size,
681 	__in	boolean_t eop,
682 	__out	efx_desc_t *edp);
683 
684 extern	void
685 hunt_tx_qdesc_tso_create(
686 	__in	efx_txq_t *etp,
687 	__in	uint16_t ipv4_id,
688 	__in	uint32_t tcp_seq,
689 	__in	uint8_t  tcp_flags,
690 	__out	efx_desc_t *edp);
691 
692 extern	void
693 ef10_tx_qdesc_tso2_create(
694 	__in			efx_txq_t *etp,
695 	__in			uint16_t ipv4_id,
696 	__in			uint32_t tcp_seq,
697 	__in			uint16_t tcp_mss,
698 	__out_ecount(count)	efx_desc_t *edp,
699 	__in			int count);
700 
701 extern	void
702 ef10_tx_qdesc_vlantci_create(
703 	__in	efx_txq_t *etp,
704 	__in	uint16_t vlan_tci,
705 	__out	efx_desc_t *edp);
706 
707 
708 #if EFSYS_OPT_QSTATS
709 
710 extern			void
711 ef10_tx_qstats_update(
712 	__in				efx_txq_t *etp,
713 	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
714 
715 #endif /* EFSYS_OPT_QSTATS */
716 
717 /* PIO */
718 
719 /* Missing register definitions */
720 #ifndef	ER_DZ_TX_PIOBUF_OFST
721 #define	ER_DZ_TX_PIOBUF_OFST 0x00001000
722 #endif
723 #ifndef	ER_DZ_TX_PIOBUF_STEP
724 #define	ER_DZ_TX_PIOBUF_STEP 8192
725 #endif
726 #ifndef	ER_DZ_TX_PIOBUF_ROWS
727 #define	ER_DZ_TX_PIOBUF_ROWS 2048
728 #endif
729 
730 #ifndef	ER_DZ_TX_PIOBUF_SIZE
731 #define	ER_DZ_TX_PIOBUF_SIZE 2048
732 #endif
733 
734 #define	HUNT_PIOBUF_NBUFS	(16)
735 #define	HUNT_PIOBUF_SIZE	(ER_DZ_TX_PIOBUF_SIZE)
736 
737 #define	HUNT_MIN_PIO_ALLOC_SIZE	(HUNT_PIOBUF_SIZE / 32)
738 
739 #define	EF10_LEGACY_PF_PRIVILEGE_MASK					\
740 	(MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN			|	\
741 	MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK			|	\
742 	MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD			|	\
743 	MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP			|	\
744 	MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS		|	\
745 	MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING		|	\
746 	MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST			|	\
747 	MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST			|	\
748 	MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST			|	\
749 	MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST		|	\
750 	MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS)
751 
752 #define	EF10_LEGACY_VF_PRIVILEGE_MASK	0
753 
754 typedef uint32_t	efx_piobuf_handle_t;
755 
756 #define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
757 
758 extern	__checkReturn	efx_rc_t
759 ef10_nic_pio_alloc(
760 	__inout		efx_nic_t *enp,
761 	__out		uint32_t *bufnump,
762 	__out		efx_piobuf_handle_t *handlep,
763 	__out		uint32_t *blknump,
764 	__out		uint32_t *offsetp,
765 	__out		size_t *sizep);
766 
767 extern	__checkReturn	efx_rc_t
768 ef10_nic_pio_free(
769 	__inout		efx_nic_t *enp,
770 	__in		uint32_t bufnum,
771 	__in		uint32_t blknum);
772 
773 extern	__checkReturn	efx_rc_t
774 ef10_nic_pio_link(
775 	__inout		efx_nic_t *enp,
776 	__in		uint32_t vi_index,
777 	__in		efx_piobuf_handle_t handle);
778 
779 extern	__checkReturn	efx_rc_t
780 ef10_nic_pio_unlink(
781 	__inout		efx_nic_t *enp,
782 	__in		uint32_t vi_index);
783 
784 
785 /* VPD */
786 
787 #if EFSYS_OPT_VPD
788 
789 extern	__checkReturn		efx_rc_t
790 ef10_vpd_init(
791 	__in			efx_nic_t *enp);
792 
793 extern	__checkReturn		efx_rc_t
794 ef10_vpd_size(
795 	__in			efx_nic_t *enp,
796 	__out			size_t *sizep);
797 
798 extern	__checkReturn		efx_rc_t
799 ef10_vpd_read(
800 	__in			efx_nic_t *enp,
801 	__out_bcount(size)	caddr_t data,
802 	__in			size_t size);
803 
804 extern	__checkReturn		efx_rc_t
805 ef10_vpd_verify(
806 	__in			efx_nic_t *enp,
807 	__in_bcount(size)	caddr_t data,
808 	__in			size_t size);
809 
810 extern	__checkReturn		efx_rc_t
811 ef10_vpd_reinit(
812 	__in			efx_nic_t *enp,
813 	__in_bcount(size)	caddr_t data,
814 	__in			size_t size);
815 
816 extern	__checkReturn		efx_rc_t
817 ef10_vpd_get(
818 	__in			efx_nic_t *enp,
819 	__in_bcount(size)	caddr_t data,
820 	__in			size_t size,
821 	__inout			efx_vpd_value_t *evvp);
822 
823 extern	__checkReturn		efx_rc_t
824 ef10_vpd_set(
825 	__in			efx_nic_t *enp,
826 	__in_bcount(size)	caddr_t data,
827 	__in			size_t size,
828 	__in			efx_vpd_value_t *evvp);
829 
830 extern	__checkReturn		efx_rc_t
831 ef10_vpd_next(
832 	__in			efx_nic_t *enp,
833 	__in_bcount(size)	caddr_t data,
834 	__in			size_t size,
835 	__out			efx_vpd_value_t *evvp,
836 	__inout			unsigned int *contp);
837 
838 extern __checkReturn		efx_rc_t
839 ef10_vpd_write(
840 	__in			efx_nic_t *enp,
841 	__in_bcount(size)	caddr_t data,
842 	__in			size_t size);
843 
844 extern				void
845 ef10_vpd_fini(
846 	__in			efx_nic_t *enp);
847 
848 #endif	/* EFSYS_OPT_VPD */
849 
850 
851 /* RX */
852 
853 extern	__checkReturn	efx_rc_t
854 ef10_rx_init(
855 	__in		efx_nic_t *enp);
856 
857 #if EFSYS_OPT_RX_SCATTER
858 extern	__checkReturn	efx_rc_t
859 ef10_rx_scatter_enable(
860 	__in		efx_nic_t *enp,
861 	__in		unsigned int buf_size);
862 #endif	/* EFSYS_OPT_RX_SCATTER */
863 
864 
865 #if EFSYS_OPT_RX_SCALE
866 
867 extern	__checkReturn	efx_rc_t
868 ef10_rx_scale_mode_set(
869 	__in		efx_nic_t *enp,
870 	__in		efx_rx_hash_alg_t alg,
871 	__in		efx_rx_hash_type_t type,
872 	__in		boolean_t insert);
873 
874 extern	__checkReturn	efx_rc_t
875 ef10_rx_scale_key_set(
876 	__in		efx_nic_t *enp,
877 	__in_ecount(n)	uint8_t *key,
878 	__in		size_t n);
879 
880 extern	__checkReturn	efx_rc_t
881 ef10_rx_scale_tbl_set(
882 	__in		efx_nic_t *enp,
883 	__in_ecount(n)	unsigned int *table,
884 	__in		size_t n);
885 
886 extern	__checkReturn	uint32_t
887 ef10_rx_prefix_hash(
888 	__in		efx_nic_t *enp,
889 	__in		efx_rx_hash_alg_t func,
890 	__in		uint8_t *buffer);
891 
892 #endif /* EFSYS_OPT_RX_SCALE */
893 
894 extern	__checkReturn	efx_rc_t
895 ef10_rx_prefix_pktlen(
896 	__in		efx_nic_t *enp,
897 	__in		uint8_t *buffer,
898 	__out		uint16_t *lengthp);
899 
900 extern			void
901 ef10_rx_qpost(
902 	__in		efx_rxq_t *erp,
903 	__in_ecount(n)	efsys_dma_addr_t *addrp,
904 	__in		size_t size,
905 	__in		unsigned int n,
906 	__in		unsigned int completed,
907 	__in		unsigned int added);
908 
909 extern			void
910 ef10_rx_qpush(
911 	__in		efx_rxq_t *erp,
912 	__in		unsigned int added,
913 	__inout		unsigned int *pushedp);
914 
915 extern	__checkReturn	efx_rc_t
916 ef10_rx_qflush(
917 	__in		efx_rxq_t *erp);
918 
919 extern		void
920 ef10_rx_qenable(
921 	__in		efx_rxq_t *erp);
922 
923 extern	__checkReturn	efx_rc_t
924 ef10_rx_qcreate(
925 	__in		efx_nic_t *enp,
926 	__in		unsigned int index,
927 	__in		unsigned int label,
928 	__in		efx_rxq_type_t type,
929 	__in		efsys_mem_t *esmp,
930 	__in		size_t n,
931 	__in		uint32_t id,
932 	__in		efx_evq_t *eep,
933 	__in		efx_rxq_t *erp);
934 
935 extern			void
936 ef10_rx_qdestroy(
937 	__in		efx_rxq_t *erp);
938 
939 extern			void
940 ef10_rx_fini(
941 	__in		efx_nic_t *enp);
942 
943 #if EFSYS_OPT_FILTER
944 
945 typedef struct ef10_filter_handle_s {
946 	uint32_t	efh_lo;
947 	uint32_t	efh_hi;
948 } ef10_filter_handle_t;
949 
950 typedef struct ef10_filter_entry_s {
951 	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
952 	ef10_filter_handle_t efe_handle;
953 } ef10_filter_entry_t;
954 
955 /*
956  * BUSY flag indicates that an update is in progress.
957  * AUTO_OLD flag is used to mark and sweep MAC packet filters.
958  */
959 #define	EFX_EF10_FILTER_FLAG_BUSY	1U
960 #define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
961 #define	EFX_EF10_FILTER_FLAGS		3U
962 
963 /*
964  * Size of the hash table used by the driver. Doesn't need to be the
965  * same size as the hardware's table.
966  */
967 #define	EFX_EF10_FILTER_TBL_ROWS 8192
968 
969 /* Allow for the broadcast address to be added to the multicast list */
970 #define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
971 
972 typedef struct ef10_filter_table_s {
973 	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
974 	efx_rxq_t *		eft_default_rxq;
975 	boolean_t 		eft_using_rss;
976 	uint32_t 		eft_unicst_filter_index;
977 	boolean_t 		eft_unicst_filter_set;
978 	uint32_t 		eft_mulcst_filter_indexes[
979 	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
980 	uint32_t 		eft_mulcst_filter_count;
981 } ef10_filter_table_t;
982 
983 	__checkReturn	efx_rc_t
984 ef10_filter_init(
985 	__in		efx_nic_t *enp);
986 
987 			void
988 ef10_filter_fini(
989 	__in		efx_nic_t *enp);
990 
991 	__checkReturn	efx_rc_t
992 ef10_filter_restore(
993 	__in		efx_nic_t *enp);
994 
995 	__checkReturn	efx_rc_t
996 ef10_filter_add(
997 	__in		efx_nic_t *enp,
998 	__inout		efx_filter_spec_t *spec,
999 	__in		boolean_t may_replace);
1000 
1001 	__checkReturn	efx_rc_t
1002 ef10_filter_delete(
1003 	__in		efx_nic_t *enp,
1004 	__inout		efx_filter_spec_t *spec);
1005 
1006 extern	__checkReturn	efx_rc_t
1007 ef10_filter_supported_filters(
1008 	__in		efx_nic_t *enp,
1009 	__out		uint32_t *list,
1010 	__out		size_t *length);
1011 
1012 extern	__checkReturn	efx_rc_t
1013 ef10_filter_reconfigure(
1014 	__in				efx_nic_t *enp,
1015 	__in_ecount(6)			uint8_t const *mac_addr,
1016 	__in				boolean_t all_unicst,
1017 	__in				boolean_t mulcst,
1018 	__in				boolean_t all_mulcst,
1019 	__in				boolean_t brdcst,
1020 	__in_ecount(6*count)		uint8_t const *addrs,
1021 	__in				int count);
1022 
1023 extern		void
1024 ef10_filter_get_default_rxq(
1025 	__in		efx_nic_t *enp,
1026 	__out		efx_rxq_t **erpp,
1027 	__out		boolean_t *using_rss);
1028 
1029 extern		void
1030 ef10_filter_default_rxq_set(
1031 	__in		efx_nic_t *enp,
1032 	__in		efx_rxq_t *erp,
1033 	__in		boolean_t using_rss);
1034 
1035 extern		void
1036 ef10_filter_default_rxq_clear(
1037 	__in		efx_nic_t *enp);
1038 
1039 
1040 #endif /* EFSYS_OPT_FILTER */
1041 
1042 extern	__checkReturn			efx_rc_t
1043 efx_mcdi_get_function_info(
1044 	__in				efx_nic_t *enp,
1045 	__out				uint32_t *pfp,
1046 	__out_opt			uint32_t *vfp);
1047 
1048 extern	__checkReturn		efx_rc_t
1049 efx_mcdi_privilege_mask(
1050 	__in			efx_nic_t *enp,
1051 	__in			uint32_t pf,
1052 	__in			uint32_t vf,
1053 	__out			uint32_t *maskp);
1054 
1055 #ifdef	__cplusplus
1056 }
1057 #endif
1058 
1059 #endif	/* _SYS_HUNT_IMPL_H */
1060