xref: /freebsd/sys/dev/sfxge/common/hunt_impl.h (revision 325151a3)
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 #define	HUNTINGTON_NVRAM_CHUNK 0x80
46 
47 /* Alignment requirement for value written to RX WPTR:
48  *  the WPTR must be aligned to an 8 descriptor boundary
49  */
50 #define	HUNTINGTON_RX_WPTR_ALIGN 8
51 
52 /* Invalid RSS context handle */
53 #define	HUNTINGTON_RSS_CONTEXT_INVALID	(0xffffffff)
54 
55 
56 /* EV */
57 
58 	__checkReturn	int
59 hunt_ev_init(
60 	__in		efx_nic_t *enp);
61 
62 			void
63 hunt_ev_fini(
64 	__in		efx_nic_t *enp);
65 
66 	__checkReturn	int
67 hunt_ev_qcreate(
68 	__in		efx_nic_t *enp,
69 	__in		unsigned int index,
70 	__in		efsys_mem_t *esmp,
71 	__in		size_t n,
72 	__in		uint32_t id,
73 	__in		efx_evq_t *eep);
74 
75 			void
76 hunt_ev_qdestroy(
77 	__in		efx_evq_t *eep);
78 
79 	__checkReturn	int
80 hunt_ev_qprime(
81 	__in		efx_evq_t *eep,
82 	__in		unsigned int count);
83 
84 			void
85 hunt_ev_qpost(
86 	__in	efx_evq_t *eep,
87 	__in	uint16_t data);
88 
89 	__checkReturn	int
90 hunt_ev_qmoderate(
91 	__in		efx_evq_t *eep,
92 	__in		unsigned int us);
93 
94 #if EFSYS_OPT_QSTATS
95 			void
96 hunt_ev_qstats_update(
97 	__in				efx_evq_t *eep,
98 	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
99 #endif /* EFSYS_OPT_QSTATS */
100 
101 		void
102 hunt_ev_rxlabel_init(
103 	__in		efx_evq_t *eep,
104 	__in		efx_rxq_t *erp,
105 	__in		unsigned int label);
106 
107 		void
108 hunt_ev_rxlabel_fini(
109 	__in		efx_evq_t *eep,
110 	__in		unsigned int label);
111 
112 /* INTR */
113 
114 	__checkReturn	int
115 hunt_intr_init(
116 	__in		efx_nic_t *enp,
117 	__in		efx_intr_type_t type,
118 	__in		efsys_mem_t *esmp);
119 
120 			void
121 hunt_intr_enable(
122 	__in		efx_nic_t *enp);
123 
124 			void
125 hunt_intr_disable(
126 	__in		efx_nic_t *enp);
127 
128 			void
129 hunt_intr_disable_unlocked(
130 	__in		efx_nic_t *enp);
131 
132 	__checkReturn	int
133 hunt_intr_trigger(
134 	__in		efx_nic_t *enp,
135 	__in		unsigned int level);
136 
137 			void
138 hunt_intr_fini(
139 	__in		efx_nic_t *enp);
140 
141 /* NIC */
142 
143 extern	__checkReturn	int
144 hunt_nic_probe(
145 	__in		efx_nic_t *enp);
146 
147 extern	__checkReturn	int
148 hunt_nic_set_drv_limits(
149 	__inout		efx_nic_t *enp,
150 	__in		efx_drv_limits_t *edlp);
151 
152 extern	__checkReturn	int
153 hunt_nic_get_vi_pool(
154 	__in		efx_nic_t *enp,
155 	__out		uint32_t *vi_countp);
156 
157 extern	__checkReturn	int
158 hunt_nic_get_bar_region(
159 	__in		efx_nic_t *enp,
160 	__in		efx_nic_region_t region,
161 	__out		uint32_t *offsetp,
162 	__out		size_t *sizep);
163 
164 extern	__checkReturn	int
165 hunt_nic_reset(
166 	__in		efx_nic_t *enp);
167 
168 extern	__checkReturn	int
169 hunt_nic_init(
170 	__in		efx_nic_t *enp);
171 
172 #if EFSYS_OPT_DIAG
173 
174 extern	__checkReturn	int
175 hunt_nic_register_test(
176 	__in		efx_nic_t *enp);
177 
178 #endif	/* EFSYS_OPT_DIAG */
179 
180 extern			void
181 hunt_nic_fini(
182 	__in		efx_nic_t *enp);
183 
184 extern			void
185 hunt_nic_unprobe(
186 	__in		efx_nic_t *enp);
187 
188 
189 /* MAC */
190 
191 extern	__checkReturn	int
192 hunt_mac_poll(
193 	__in		efx_nic_t *enp,
194 	__out		efx_link_mode_t *link_modep);
195 
196 extern	__checkReturn	int
197 hunt_mac_up(
198 	__in		efx_nic_t *enp,
199 	__out		boolean_t *mac_upp);
200 
201 extern	__checkReturn	int
202 hunt_mac_addr_set(
203 	__in	efx_nic_t *enp);
204 
205 extern	__checkReturn	int
206 hunt_mac_reconfigure(
207 	__in	efx_nic_t *enp);
208 
209 extern	__checkReturn	int
210 hunt_mac_multicast_list_set(
211 	__in				efx_nic_t *enp);
212 
213 extern	__checkReturn	int
214 hunt_mac_filter_default_rxq_set(
215 	__in		efx_nic_t *enp,
216 	__in		efx_rxq_t *erp,
217 	__in		boolean_t using_rss);
218 
219 extern			void
220 hunt_mac_filter_default_rxq_clear(
221 	__in		efx_nic_t *enp);
222 
223 #if EFSYS_OPT_LOOPBACK
224 
225 extern	__checkReturn	int
226 hunt_mac_loopback_set(
227 	__in		efx_nic_t *enp,
228 	__in		efx_link_mode_t link_mode,
229 	__in		efx_loopback_type_t loopback_type);
230 
231 #endif	/* EFSYS_OPT_LOOPBACK */
232 
233 #if EFSYS_OPT_MAC_STATS
234 
235 extern	__checkReturn			int
236 hunt_mac_stats_update(
237 	__in				efx_nic_t *enp,
238 	__in				efsys_mem_t *esmp,
239 	__out_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
240 	__out_opt			uint32_t *generationp);
241 
242 #endif	/* EFSYS_OPT_MAC_STATS */
243 
244 
245 /* MCDI */
246 
247 #if EFSYS_OPT_MCDI
248 
249 extern	__checkReturn	int
250 hunt_mcdi_init(
251 	__in		efx_nic_t *enp,
252 	__in		const efx_mcdi_transport_t *mtp);
253 
254 extern			void
255 hunt_mcdi_fini(
256 	__in		efx_nic_t *enp);
257 
258 extern			void
259 hunt_mcdi_request_copyin(
260 	__in		efx_nic_t *enp,
261 	__in		efx_mcdi_req_t *emrp,
262 	__in		unsigned int seq,
263 	__in		boolean_t ev_cpl,
264 	__in		boolean_t new_epoch);
265 
266 extern	__checkReturn	boolean_t
267 hunt_mcdi_request_poll(
268 	__in		efx_nic_t *enp);
269 
270 extern			void
271 hunt_mcdi_request_copyout(
272 	__in		efx_nic_t *enp,
273 	__in		efx_mcdi_req_t *emrp);
274 
275 extern			int
276 hunt_mcdi_poll_reboot(
277 	__in		efx_nic_t *enp);
278 
279 extern	__checkReturn	int
280 hunt_mcdi_fw_update_supported(
281 	__in		efx_nic_t *enp,
282 	__out		boolean_t *supportedp);
283 
284 extern	__checkReturn	int
285 hunt_mcdi_macaddr_change_supported(
286 	__in		efx_nic_t *enp,
287 	__out		boolean_t *supportedp);
288 
289 #endif /* EFSYS_OPT_MCDI */
290 
291 /* NVRAM */
292 
293 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
294 
295 extern	__checkReturn		int
296 hunt_nvram_buf_read_tlv(
297 	__in				efx_nic_t *enp,
298 	__in_bcount(partn_size)		caddr_t partn_data,
299 	__in				size_t partn_size,
300 	__in				uint32_t tag,
301 	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
302 	__out				size_t *sizep);
303 
304 extern	__checkReturn		int
305 hunt_nvram_buf_write_tlv(
306 	__inout_bcount(partn_size)	caddr_t partn_data,
307 	__in				size_t partn_size,
308 	__in				uint32_t tag,
309 	__in_bcount(tag_size)		caddr_t tag_data,
310 	__in				size_t tag_size,
311 	__out				size_t *total_lengthp);
312 
313 extern	__checkReturn		int
314 hunt_nvram_partn_read_tlv(
315 	__in				efx_nic_t *enp,
316 	__in				uint32_t partn,
317 	__in				uint32_t tag,
318 	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
319 	__out				size_t *sizep);
320 
321 extern	__checkReturn		int
322 hunt_nvram_partn_write_tlv(
323 	__in		   	efx_nic_t *enp,
324 	__in		    	uint32_t partn,
325 	__in		     	uint32_t tag,
326 	__in_bcount(size)	caddr_t data,
327 	__in			size_t size);
328 
329 extern	__checkReturn		int
330 hunt_nvram_partn_size(
331 	__in			efx_nic_t *enp,
332 	__in			unsigned int partn,
333 	__out			size_t *sizep);
334 
335 extern	__checkReturn		int
336 hunt_nvram_partn_lock(
337 	__in			efx_nic_t *enp,
338 	__in			unsigned int partn);
339 
340 extern	__checkReturn		int
341 hunt_nvram_partn_read(
342 	__in			efx_nic_t *enp,
343 	__in			unsigned int partn,
344 	__in			unsigned int offset,
345 	__out_bcount(size)	caddr_t data,
346 	__in			size_t size);
347 
348 extern	__checkReturn		int
349 hunt_nvram_partn_erase(
350 	__in			efx_nic_t *enp,
351 	__in			unsigned int partn,
352 	__in			unsigned int offset,
353 	__in			size_t size);
354 
355 extern	__checkReturn		int
356 hunt_nvram_partn_write(
357 	__in			efx_nic_t *enp,
358 	__in			unsigned int partn,
359 	__in			unsigned int offset,
360 	__out_bcount(size)	caddr_t data,
361 	__in			size_t size);
362 
363 extern				void
364 hunt_nvram_partn_unlock(
365 	__in			efx_nic_t *enp,
366 	__in			unsigned int partn);
367 
368 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
369 
370 #if EFSYS_OPT_NVRAM
371 
372 #if EFSYS_OPT_DIAG
373 
374 extern	__checkReturn		int
375 hunt_nvram_test(
376 	__in			efx_nic_t *enp);
377 
378 #endif	/* EFSYS_OPT_DIAG */
379 
380 extern	__checkReturn		int
381 hunt_nvram_size(
382 	__in			efx_nic_t *enp,
383 	__in			efx_nvram_type_t type,
384 	__out			size_t *sizep);
385 
386 extern	__checkReturn		int
387 hunt_nvram_get_version(
388 	__in			efx_nic_t *enp,
389 	__in			efx_nvram_type_t type,
390 	__out			uint32_t *subtypep,
391 	__out_ecount(4)		uint16_t version[4]);
392 
393 extern	__checkReturn		int
394 hunt_nvram_rw_start(
395 	__in			efx_nic_t *enp,
396 	__in			efx_nvram_type_t type,
397 	__out			size_t *pref_chunkp);
398 
399 extern	__checkReturn		int
400 hunt_nvram_read_chunk(
401 	__in			efx_nic_t *enp,
402 	__in			efx_nvram_type_t type,
403 	__in			unsigned int offset,
404 	__out_bcount(size)	caddr_t data,
405 	__in			size_t size);
406 
407 extern	 __checkReturn		int
408 hunt_nvram_erase(
409 	__in			efx_nic_t *enp,
410 	__in			efx_nvram_type_t type);
411 
412 extern	__checkReturn		int
413 hunt_nvram_write_chunk(
414 	__in			efx_nic_t *enp,
415 	__in			efx_nvram_type_t type,
416 	__in			unsigned int offset,
417 	__in_bcount(size)	caddr_t data,
418 	__in			size_t size);
419 
420 extern				void
421 hunt_nvram_rw_finish(
422 	__in			efx_nic_t *enp,
423 	__in			efx_nvram_type_t type);
424 
425 extern	__checkReturn		int
426 hunt_nvram_partn_set_version(
427 	__in			efx_nic_t *enp,
428 	__in			unsigned int partn,
429 	__in_ecount(4)		uint16_t version[4]);
430 
431 extern	__checkReturn		int
432 hunt_nvram_set_version(
433 	__in			efx_nic_t *enp,
434 	__in			efx_nvram_type_t type,
435 	__in_ecount(4)		uint16_t version[4]);
436 
437 #endif	/* EFSYS_OPT_NVRAM */
438 
439 
440 /* PHY */
441 
442 typedef struct hunt_link_state_s {
443 	uint32_t		hls_adv_cap_mask;
444 	uint32_t		hls_lp_cap_mask;
445 	unsigned int 		hls_fcntl;
446 	efx_link_mode_t		hls_link_mode;
447 #if EFSYS_OPT_LOOPBACK
448 	efx_loopback_type_t	hls_loopback;
449 #endif
450 	boolean_t		hls_mac_up;
451 } hunt_link_state_t;
452 
453 extern			void
454 hunt_phy_link_ev(
455 	__in		efx_nic_t *enp,
456 	__in		efx_qword_t *eqp,
457 	__out		efx_link_mode_t *link_modep);
458 
459 extern	__checkReturn	int
460 hunt_phy_get_link(
461 	__in		efx_nic_t *enp,
462 	__out		hunt_link_state_t *hlsp);
463 
464 extern	__checkReturn	int
465 hunt_phy_power(
466 	__in		efx_nic_t *enp,
467 	__in		boolean_t on);
468 
469 extern	__checkReturn	int
470 hunt_phy_reconfigure(
471 	__in		efx_nic_t *enp);
472 
473 extern	__checkReturn	int
474 hunt_phy_verify(
475 	__in		efx_nic_t *enp);
476 
477 extern	__checkReturn	int
478 hunt_phy_oui_get(
479 	__in		efx_nic_t *enp,
480 	__out		uint32_t *ouip);
481 
482 #if EFSYS_OPT_PHY_STATS
483 
484 extern	__checkReturn			int
485 hunt_phy_stats_update(
486 	__in				efx_nic_t *enp,
487 	__in				efsys_mem_t *esmp,
488 	__out_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
489 
490 #endif	/* EFSYS_OPT_PHY_STATS */
491 
492 #if EFSYS_OPT_PHY_PROPS
493 
494 #if EFSYS_OPT_NAMES
495 
496 extern		const char *
497 hunt_phy_prop_name(
498 	__in	efx_nic_t *enp,
499 	__in	unsigned int id);
500 
501 #endif	/* EFSYS_OPT_NAMES */
502 
503 extern	__checkReturn	int
504 hunt_phy_prop_get(
505 	__in		efx_nic_t *enp,
506 	__in		unsigned int id,
507 	__in		uint32_t flags,
508 	__out		uint32_t *valp);
509 
510 extern	__checkReturn	int
511 hunt_phy_prop_set(
512 	__in		efx_nic_t *enp,
513 	__in		unsigned int id,
514 	__in		uint32_t val);
515 
516 #endif	/* EFSYS_OPT_PHY_PROPS */
517 
518 #if EFSYS_OPT_BIST
519 
520 extern	__checkReturn		int
521 hunt_bist_enable_offline(
522 	__in			efx_nic_t *enp);
523 
524 extern	__checkReturn		int
525 hunt_bist_start(
526 	__in			efx_nic_t *enp,
527 	__in			efx_bist_type_t type);
528 
529 extern	__checkReturn		int
530 hunt_bist_poll(
531 	__in			efx_nic_t *enp,
532 	__in			efx_bist_type_t type,
533 	__out			efx_bist_result_t *resultp,
534 	__out_opt __drv_when(count > 0, __notnull)
535 	uint32_t 	*value_maskp,
536 	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
537 	unsigned long	*valuesp,
538 	__in			size_t count);
539 
540 extern				void
541 hunt_bist_stop(
542 	__in			efx_nic_t *enp,
543 	__in			efx_bist_type_t type);
544 
545 #endif	/* EFSYS_OPT_BIST */
546 
547 
548 /* SRAM */
549 
550 #if EFSYS_OPT_DIAG
551 
552 extern	__checkReturn	int
553 hunt_sram_test(
554 	__in		efx_nic_t *enp,
555 	__in		efx_sram_pattern_fn_t func);
556 
557 #endif	/* EFSYS_OPT_DIAG */
558 
559 
560 /* TX */
561 
562 extern	__checkReturn	int
563 hunt_tx_init(
564 	__in		efx_nic_t *enp);
565 
566 extern			void
567 hunt_tx_fini(
568 	__in		efx_nic_t *enp);
569 
570 extern	__checkReturn	int
571 hunt_tx_qcreate(
572 	__in		efx_nic_t *enp,
573 	__in		unsigned int index,
574 	__in		unsigned int label,
575 	__in		efsys_mem_t *esmp,
576 	__in		size_t n,
577 	__in		uint32_t id,
578 	__in		uint16_t flags,
579 	__in		efx_evq_t *eep,
580 	__in		efx_txq_t *etp,
581 	__out		unsigned int *addedp);
582 
583 extern		void
584 hunt_tx_qdestroy(
585 	__in		efx_txq_t *etp);
586 
587 extern	__checkReturn	int
588 hunt_tx_qpost(
589 	__in		efx_txq_t *etp,
590 	__in_ecount(n)	efx_buffer_t *eb,
591 	__in		unsigned int n,
592 	__in		unsigned int completed,
593 	__inout		unsigned int *addedp);
594 
595 extern			void
596 hunt_tx_qpush(
597 	__in		efx_txq_t *etp,
598 	__in		unsigned int added,
599 	__in		unsigned int pushed);
600 
601 extern	__checkReturn	int
602 hunt_tx_qpace(
603 	__in		efx_txq_t *etp,
604 	__in		unsigned int ns);
605 
606 extern	__checkReturn	int
607 hunt_tx_qflush(
608 	__in		efx_txq_t *etp);
609 
610 extern			void
611 hunt_tx_qenable(
612 	__in		efx_txq_t *etp);
613 
614 extern	__checkReturn	int
615 hunt_tx_qpio_enable(
616 	__in		efx_txq_t *etp);
617 
618 extern			void
619 hunt_tx_qpio_disable(
620 	__in		efx_txq_t *etp);
621 
622 extern	__checkReturn	int
623 hunt_tx_qpio_write(
624 	__in			efx_txq_t *etp,
625 	__in_ecount(buf_length)	uint8_t *buffer,
626 	__in			size_t buf_length,
627 	__in                    size_t pio_buf_offset);
628 
629 extern	__checkReturn	int
630 hunt_tx_qpio_post(
631 	__in			efx_txq_t *etp,
632 	__in			size_t pkt_length,
633 	__in			unsigned int completed,
634 	__inout			unsigned int *addedp);
635 
636 extern	__checkReturn	int
637 hunt_tx_qdesc_post(
638 	__in		efx_txq_t *etp,
639 	__in_ecount(n)	efx_desc_t *ed,
640 	__in		unsigned int n,
641 	__in		unsigned int completed,
642 	__inout		unsigned int *addedp);
643 
644 extern	void
645 hunt_tx_qdesc_dma_create(
646 	__in	efx_txq_t *etp,
647 	__in	efsys_dma_addr_t addr,
648 	__in	size_t size,
649 	__in	boolean_t eop,
650 	__out	efx_desc_t *edp);
651 
652 extern	void
653 hunt_tx_qdesc_tso_create(
654 	__in	efx_txq_t *etp,
655 	__in	uint16_t ipv4_id,
656 	__in	uint32_t tcp_seq,
657 	__in	uint8_t  tcp_flags,
658 	__out	efx_desc_t *edp);
659 
660 extern	void
661 hunt_tx_qdesc_vlantci_create(
662 	__in	efx_txq_t *etp,
663 	__in	uint16_t vlan_tci,
664 	__out	efx_desc_t *edp);
665 
666 
667 #if EFSYS_OPT_QSTATS
668 
669 extern			void
670 hunt_tx_qstats_update(
671 	__in				efx_txq_t *etp,
672 	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
673 
674 #endif /* EFSYS_OPT_QSTATS */
675 
676 /* PIO */
677 
678 /* Missing register definitions */
679 #ifndef	ER_DZ_TX_PIOBUF_OFST
680 #define	ER_DZ_TX_PIOBUF_OFST 0x00001000
681 #endif
682 #ifndef	ER_DZ_TX_PIOBUF_STEP
683 #define	ER_DZ_TX_PIOBUF_STEP 8192
684 #endif
685 #ifndef	ER_DZ_TX_PIOBUF_ROWS
686 #define	ER_DZ_TX_PIOBUF_ROWS 2048
687 #endif
688 
689 #ifndef	ER_DZ_TX_PIOBUF_SIZE
690 #define	ER_DZ_TX_PIOBUF_SIZE 2048
691 #endif
692 
693 #define	HUNT_PIOBUF_NBUFS	(16)
694 #define	HUNT_PIOBUF_SIZE	(ER_DZ_TX_PIOBUF_SIZE)
695 
696 #define	HUNT_MIN_PIO_ALLOC_SIZE	(HUNT_PIOBUF_SIZE / 32)
697 
698 #define HUNT_LEGACY_PF_PRIVILEGE_MASK					\
699 	(MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN			|	\
700 	MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK			|	\
701 	MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD			|	\
702 	MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP			|	\
703 	MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS		|	\
704 	MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING		|	\
705 	MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST			|	\
706 	MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST			|	\
707 	MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST			|	\
708 	MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST		|	\
709 	MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS)
710 
711 #define HUNT_LEGACY_VF_PRIVILEGE_MASK	0
712 
713 typedef uint32_t	efx_piobuf_handle_t;
714 
715 #define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
716 
717 extern	__checkReturn	int
718 hunt_nic_pio_alloc(
719 	__inout		efx_nic_t *enp,
720 	__out		uint32_t *bufnump,
721 	__out		efx_piobuf_handle_t *handlep,
722 	__out		uint32_t *blknump,
723 	__out		uint32_t *offsetp,
724 	__out		size_t *sizep);
725 
726 extern	__checkReturn	int
727 hunt_nic_pio_free(
728 	__inout		efx_nic_t *enp,
729 	__in		uint32_t bufnum,
730 	__in		uint32_t blknum);
731 
732 extern	__checkReturn	int
733 hunt_nic_pio_link(
734 	__inout		efx_nic_t *enp,
735 	__in		uint32_t vi_index,
736 	__in		efx_piobuf_handle_t handle);
737 
738 extern	__checkReturn	int
739 hunt_nic_pio_unlink(
740 	__inout		efx_nic_t *enp,
741 	__in		uint32_t vi_index);
742 
743 
744 /* VPD */
745 
746 #if EFSYS_OPT_VPD
747 
748 extern	__checkReturn		int
749 hunt_vpd_init(
750 	__in			efx_nic_t *enp);
751 
752 extern	__checkReturn		int
753 hunt_vpd_size(
754 	__in			efx_nic_t *enp,
755 	__out			size_t *sizep);
756 
757 extern	__checkReturn		int
758 hunt_vpd_read(
759 	__in			efx_nic_t *enp,
760 	__out_bcount(size)	caddr_t data,
761 	__in			size_t size);
762 
763 extern	__checkReturn		int
764 hunt_vpd_verify(
765 	__in			efx_nic_t *enp,
766 	__in_bcount(size)	caddr_t data,
767 	__in			size_t size);
768 
769 extern	__checkReturn		int
770 hunt_vpd_reinit(
771 	__in			efx_nic_t *enp,
772 	__in_bcount(size)	caddr_t data,
773 	__in			size_t size);
774 
775 extern	__checkReturn		int
776 hunt_vpd_get(
777 	__in			efx_nic_t *enp,
778 	__in_bcount(size)	caddr_t data,
779 	__in			size_t size,
780 	__inout			efx_vpd_value_t *evvp);
781 
782 extern	__checkReturn		int
783 hunt_vpd_set(
784 	__in			efx_nic_t *enp,
785 	__in_bcount(size)	caddr_t data,
786 	__in			size_t size,
787 	__in			efx_vpd_value_t *evvp);
788 
789 extern	__checkReturn		int
790 hunt_vpd_next(
791 	__in			efx_nic_t *enp,
792 	__in_bcount(size)	caddr_t data,
793 	__in			size_t size,
794 	__out			efx_vpd_value_t *evvp,
795 	__inout			unsigned int *contp);
796 
797 extern __checkReturn		int
798 hunt_vpd_write(
799 	__in			efx_nic_t *enp,
800 	__in_bcount(size)	caddr_t data,
801 	__in			size_t size);
802 
803 extern				void
804 hunt_vpd_fini(
805 	__in			efx_nic_t *enp);
806 
807 #endif	/* EFSYS_OPT_VPD */
808 
809 
810 /* RX */
811 
812 extern	__checkReturn	int
813 hunt_rx_init(
814 	__in		efx_nic_t *enp);
815 
816 #if EFSYS_OPT_RX_HDR_SPLIT
817 extern	__checkReturn	int
818 hunt_rx_hdr_split_enable(
819 	__in		efx_nic_t *enp,
820 	__in		unsigned int hdr_buf_size,
821 	__in		unsigned int pld_buf_size);
822 #endif	/* EFSYS_OPT_RX_HDR_SPLIT */
823 
824 #if EFSYS_OPT_RX_SCATTER
825 extern	__checkReturn	int
826 hunt_rx_scatter_enable(
827 	__in		efx_nic_t *enp,
828 	__in		unsigned int buf_size);
829 #endif	/* EFSYS_OPT_RX_SCATTER */
830 
831 
832 #if EFSYS_OPT_RX_SCALE
833 
834 extern	__checkReturn	int
835 hunt_rx_scale_mode_set(
836 	__in		efx_nic_t *enp,
837 	__in		efx_rx_hash_alg_t alg,
838 	__in		efx_rx_hash_type_t type,
839 	__in		boolean_t insert);
840 
841 extern	__checkReturn	int
842 hunt_rx_scale_key_set(
843 	__in		efx_nic_t *enp,
844 	__in_ecount(n)	uint8_t *key,
845 	__in		size_t n);
846 
847 extern	__checkReturn	int
848 hunt_rx_scale_tbl_set(
849 	__in		efx_nic_t *enp,
850 	__in_ecount(n)	unsigned int *table,
851 	__in		size_t n);
852 
853 #endif /* EFSYS_OPT_RX_SCALE */
854 
855 extern			void
856 hunt_rx_qpost(
857 	__in		efx_rxq_t *erp,
858 	__in_ecount(n)	efsys_dma_addr_t *addrp,
859 	__in		size_t size,
860 	__in		unsigned int n,
861 	__in		unsigned int completed,
862 	__in		unsigned int added);
863 
864 extern			void
865 hunt_rx_qpush(
866 	__in		efx_rxq_t *erp,
867 	__in		unsigned int added,
868 	__inout		unsigned int *pushedp);
869 
870 extern	__checkReturn	int
871 hunt_rx_qflush(
872 	__in		efx_rxq_t *erp);
873 
874 extern		void
875 hunt_rx_qenable(
876 	__in		efx_rxq_t *erp);
877 
878 extern	__checkReturn	int
879 hunt_rx_qcreate(
880 	__in		efx_nic_t *enp,
881 	__in		unsigned int index,
882 	__in		unsigned int label,
883 	__in		efx_rxq_type_t type,
884 	__in		efsys_mem_t *esmp,
885 	__in		size_t n,
886 	__in		uint32_t id,
887 	__in		efx_evq_t *eep,
888 	__in		efx_rxq_t *erp);
889 
890 extern			void
891 hunt_rx_qdestroy(
892 	__in		efx_rxq_t *erp);
893 
894 extern			void
895 hunt_rx_fini(
896 	__in		efx_nic_t *enp);
897 
898 #if EFSYS_OPT_FILTER
899 
900 typedef struct hunt_filter_handle_s {
901 	uint32_t	hfh_lo;
902 	uint32_t	hfh_hi;
903 } hunt_filter_handle_t;
904 
905 typedef struct hunt_filter_entry_s {
906 	uintptr_t hfe_spec; /* pointer to filter spec plus busy bit */
907 	hunt_filter_handle_t hfe_handle;
908 } hunt_filter_entry_t;
909 
910 /*
911  * BUSY flag indicates that an update is in progress.
912  * AUTO_OLD flag is used to mark and sweep MAC packet filters.
913  */
914 #define	EFX_HUNT_FILTER_FLAG_BUSY	1U
915 #define	EFX_HUNT_FILTER_FLAG_AUTO_OLD	2U
916 #define	EFX_HUNT_FILTER_FLAGS		3U
917 
918 #define	EFX_HUNT_FILTER_TBL_ROWS 8192
919 
920 /* Allow for the broadcast address to be added to the multicast list */
921 #define	EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
922 
923 typedef struct hunt_filter_table_s {
924 	hunt_filter_entry_t	hft_entry[EFX_HUNT_FILTER_TBL_ROWS];
925 	efx_rxq_t *		hft_default_rxq;
926 	boolean_t 		hft_using_rss;
927 	uint32_t 		hft_unicst_filter_index;
928 	boolean_t 		hft_unicst_filter_set;
929 	uint32_t 		hft_mulcst_filter_indexes[
930 	    EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX];
931 	uint32_t 		hft_mulcst_filter_count;
932 } hunt_filter_table_t;
933 
934 	__checkReturn	int
935 hunt_filter_init(
936 	__in		efx_nic_t *enp);
937 
938 			void
939 hunt_filter_fini(
940 	__in		efx_nic_t *enp);
941 
942 	__checkReturn	int
943 hunt_filter_restore(
944 	__in		efx_nic_t *enp);
945 
946 	__checkReturn	int
947 hunt_filter_add(
948 	__in		efx_nic_t *enp,
949 	__inout		efx_filter_spec_t *spec,
950 	__in		boolean_t may_replace);
951 
952 	__checkReturn	int
953 hunt_filter_delete(
954 	__in		efx_nic_t *enp,
955 	__inout		efx_filter_spec_t *spec);
956 
957 extern	__checkReturn	int
958 hunt_filter_supported_filters(
959 	__in		efx_nic_t *enp,
960 	__out		uint32_t *list,
961 	__out		size_t *length);
962 
963 extern	__checkReturn	int
964 hunt_filter_reconfigure(
965 	__in				efx_nic_t *enp,
966 	__in_ecount(6)			uint8_t const *mac_addr,
967 	__in				boolean_t all_unicst,
968 	__in				boolean_t mulcst,
969 	__in				boolean_t all_mulcst,
970 	__in				boolean_t brdcst,
971 	__in_ecount(6*count)		uint8_t const *addrs,
972 	__in				int count);
973 
974 extern		void
975 hunt_filter_get_default_rxq(
976 	__in		efx_nic_t *enp,
977 	__out		efx_rxq_t **erpp,
978 	__out		boolean_t *using_rss);
979 
980 extern		void
981 hunt_filter_default_rxq_set(
982 	__in		efx_nic_t *enp,
983 	__in		efx_rxq_t *erp,
984 	__in		boolean_t using_rss);
985 
986 extern		void
987 hunt_filter_default_rxq_clear(
988 	__in		efx_nic_t *enp);
989 
990 
991 #endif /* EFSYS_OPT_FILTER */
992 
993 extern	__checkReturn			int
994 hunt_pktfilter_set(
995 	__in				efx_nic_t *enp,
996 	__in				boolean_t unicst,
997 	__in				boolean_t brdcst);
998 
999 #if EFSYS_OPT_MCAST_FILTER_LIST
1000 
1001 extern	__checkReturn			int
1002 hunt_pktfilter_mcast_set(
1003 	__in				efx_nic_t *enp,
1004 	__in				uint8_t const *addrs,
1005 	__in				int count);
1006 
1007 #endif /* EFSYS_OPT_MCAST_FILTER_LIST */
1008 
1009 extern	__checkReturn			int
1010 hunt_pktfilter_mcast_all(
1011 	__in				efx_nic_t *enp);
1012 
1013 extern	__checkReturn			int
1014 efx_mcdi_get_function_info(
1015 	__in				efx_nic_t *enp,
1016 	__out				uint32_t *pfp,
1017 	__out_opt			uint32_t *vfp);
1018 
1019 extern	__checkReturn		int
1020 efx_mcdi_privilege_mask(
1021 	__in			efx_nic_t *enp,
1022 	__in			uint32_t pf,
1023 	__in			uint32_t vf,
1024 	__out			uint32_t *maskp);
1025 
1026 #ifdef	__cplusplus
1027 }
1028 #endif
1029 
1030 #endif	/* _SYS_HUNT_IMPL_H */
1031