hunt_impl.h revision 284555
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: stable/10/sys/dev/sfxge/common/hunt_impl.h 284555 2015-06-18 15:46:39Z arybchik $
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
42extern "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
59hunt_ev_init(
60	__in		efx_nic_t *enp);
61
62			void
63hunt_ev_fini(
64	__in		efx_nic_t *enp);
65
66	__checkReturn	int
67hunt_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
76hunt_ev_qdestroy(
77	__in		efx_evq_t *eep);
78
79	__checkReturn	int
80hunt_ev_qprime(
81	__in		efx_evq_t *eep,
82	__in		unsigned int count);
83
84			void
85hunt_ev_qpost(
86	__in	efx_evq_t *eep,
87	__in	uint16_t data);
88
89	__checkReturn	int
90hunt_ev_qmoderate(
91	__in		efx_evq_t *eep,
92	__in		unsigned int us);
93
94#if EFSYS_OPT_QSTATS
95			void
96hunt_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
102hunt_ev_rxlabel_init(
103	__in		efx_evq_t *eep,
104	__in		efx_rxq_t *erp,
105	__in		unsigned int label);
106
107		void
108hunt_ev_rxlabel_fini(
109	__in		efx_evq_t *eep,
110	__in		unsigned int label);
111
112/* INTR */
113
114	__checkReturn	int
115hunt_intr_init(
116	__in		efx_nic_t *enp,
117	__in		efx_intr_type_t type,
118	__in		efsys_mem_t *esmp);
119
120			void
121hunt_intr_enable(
122	__in		efx_nic_t *enp);
123
124			void
125hunt_intr_disable(
126	__in		efx_nic_t *enp);
127
128			void
129hunt_intr_disable_unlocked(
130	__in		efx_nic_t *enp);
131
132	__checkReturn	int
133hunt_intr_trigger(
134	__in		efx_nic_t *enp,
135	__in		unsigned int level);
136
137			void
138hunt_intr_fini(
139	__in		efx_nic_t *enp);
140
141/* NIC */
142
143extern	__checkReturn	int
144hunt_nic_probe(
145	__in		efx_nic_t *enp);
146
147extern	__checkReturn	int
148hunt_nic_set_drv_limits(
149	__inout		efx_nic_t *enp,
150	__in		efx_drv_limits_t *edlp);
151
152extern	__checkReturn	int
153hunt_nic_get_vi_pool(
154	__in		efx_nic_t *enp,
155	__out		uint32_t *vi_countp);
156
157extern	__checkReturn	int
158hunt_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
164extern	__checkReturn	int
165hunt_nic_reset(
166	__in		efx_nic_t *enp);
167
168extern	__checkReturn	int
169hunt_nic_init(
170	__in		efx_nic_t *enp);
171
172#if EFSYS_OPT_DIAG
173
174extern	__checkReturn	int
175hunt_nic_register_test(
176	__in		efx_nic_t *enp);
177
178#endif	/* EFSYS_OPT_DIAG */
179
180extern			void
181hunt_nic_fini(
182	__in		efx_nic_t *enp);
183
184extern			void
185hunt_nic_unprobe(
186	__in		efx_nic_t *enp);
187
188
189/* MAC */
190
191extern	__checkReturn	int
192hunt_mac_poll(
193	__in		efx_nic_t *enp,
194	__out		efx_link_mode_t *link_modep);
195
196extern	__checkReturn	int
197hunt_mac_up(
198	__in		efx_nic_t *enp,
199	__out		boolean_t *mac_upp);
200
201extern	__checkReturn	int
202hunt_mac_addr_set(
203	__in	efx_nic_t *enp);
204
205extern	__checkReturn	int
206hunt_mac_reconfigure(
207	__in	efx_nic_t *enp);
208
209extern	__checkReturn	int
210hunt_mac_multicast_list_set(
211	__in				efx_nic_t *enp);
212
213extern	__checkReturn	int
214hunt_mac_filter_default_rxq_set(
215	__in		efx_nic_t *enp,
216	__in		efx_rxq_t *erp,
217	__in		boolean_t using_rss);
218
219extern			void
220hunt_mac_filter_default_rxq_clear(
221	__in		efx_nic_t *enp);
222
223#if EFSYS_OPT_LOOPBACK
224
225extern	__checkReturn	int
226hunt_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
235extern	__checkReturn			int
236hunt_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
249extern	__checkReturn	int
250hunt_mcdi_init(
251	__in		efx_nic_t *enp,
252	__in		const efx_mcdi_transport_t *mtp);
253
254extern			void
255hunt_mcdi_fini(
256	__in		efx_nic_t *enp);
257
258extern			void
259hunt_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
266extern	__checkReturn	boolean_t
267hunt_mcdi_request_poll(
268	__in		efx_nic_t *enp);
269
270extern			void
271hunt_mcdi_request_copyout(
272	__in		efx_nic_t *enp,
273	__in		efx_mcdi_req_t *emrp);
274
275extern			int
276hunt_mcdi_poll_reboot(
277	__in		efx_nic_t *enp);
278
279extern	__checkReturn	int
280hunt_mcdi_fw_update_supported(
281	__in		efx_nic_t *enp,
282	__out		boolean_t *supportedp);
283
284extern	__checkReturn	int
285hunt_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
295extern	__checkReturn		int
296hunt_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
304extern	__checkReturn		int
305hunt_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
313extern	__checkReturn		int
314hunt_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
321extern	__checkReturn		int
322hunt_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
329extern	__checkReturn		int
330hunt_nvram_partn_size(
331	__in			efx_nic_t *enp,
332	__in			unsigned int partn,
333	__out			size_t *sizep);
334
335extern	__checkReturn		int
336hunt_nvram_partn_lock(
337	__in			efx_nic_t *enp,
338	__in			unsigned int partn);
339
340extern	__checkReturn		int
341hunt_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
348extern	__checkReturn		int
349hunt_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
355extern	__checkReturn		int
356hunt_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
363extern				void
364hunt_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
374extern	__checkReturn		int
375hunt_nvram_test(
376	__in			efx_nic_t *enp);
377
378#endif	/* EFSYS_OPT_DIAG */
379
380extern	__checkReturn		int
381hunt_nvram_size(
382	__in			efx_nic_t *enp,
383	__in			efx_nvram_type_t type,
384	__out			size_t *sizep);
385
386extern	__checkReturn		int
387hunt_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
393extern	__checkReturn		int
394hunt_nvram_rw_start(
395	__in			efx_nic_t *enp,
396	__in			efx_nvram_type_t type,
397	__out			size_t *pref_chunkp);
398
399extern	__checkReturn		int
400hunt_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
407extern	 __checkReturn		int
408hunt_nvram_erase(
409	__in			efx_nic_t *enp,
410	__in			efx_nvram_type_t type);
411
412extern	__checkReturn		int
413hunt_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
420extern				void
421hunt_nvram_rw_finish(
422	__in			efx_nic_t *enp,
423	__in			efx_nvram_type_t type);
424
425extern	__checkReturn		int
426hunt_nvram_partn_set_version(
427	__in			efx_nic_t *enp,
428	__in			unsigned int partn,
429	__in_ecount(4)		uint16_t version[4]);
430
431extern	__checkReturn		int
432hunt_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
442typedef 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
453extern			void
454hunt_phy_link_ev(
455	__in		efx_nic_t *enp,
456	__in		efx_qword_t *eqp,
457	__out		efx_link_mode_t *link_modep);
458
459extern	__checkReturn	int
460hunt_phy_get_link(
461	__in		efx_nic_t *enp,
462	__out		hunt_link_state_t *hlsp);
463
464extern	__checkReturn	int
465hunt_phy_power(
466	__in		efx_nic_t *enp,
467	__in		boolean_t on);
468
469extern	__checkReturn	int
470hunt_phy_reconfigure(
471	__in		efx_nic_t *enp);
472
473extern	__checkReturn	int
474hunt_phy_verify(
475	__in		efx_nic_t *enp);
476
477extern	__checkReturn	int
478hunt_phy_oui_get(
479	__in		efx_nic_t *enp,
480	__out		uint32_t *ouip);
481
482#if EFSYS_OPT_PHY_STATS
483
484extern	__checkReturn			int
485hunt_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
496extern		const char *
497hunt_phy_prop_name(
498	__in	efx_nic_t *enp,
499	__in	unsigned int id);
500
501#endif	/* EFSYS_OPT_NAMES */
502
503extern	__checkReturn	int
504hunt_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
510extern	__checkReturn	int
511hunt_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
520extern	__checkReturn		int
521hunt_bist_enable_offline(
522	__in			efx_nic_t *enp);
523
524extern	__checkReturn		int
525hunt_bist_start(
526	__in			efx_nic_t *enp,
527	__in			efx_bist_type_t type);
528
529extern	__checkReturn		int
530hunt_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
540extern				void
541hunt_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
552extern	__checkReturn	int
553hunt_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
562extern	__checkReturn	int
563hunt_tx_init(
564	__in		efx_nic_t *enp);
565
566extern			void
567hunt_tx_fini(
568	__in		efx_nic_t *enp);
569
570extern	__checkReturn	int
571hunt_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
583extern		void
584hunt_tx_qdestroy(
585	__in		efx_txq_t *etp);
586
587extern	__checkReturn	int
588hunt_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
595extern			void
596hunt_tx_qpush(
597	__in		efx_txq_t *etp,
598	__in		unsigned int added,
599	__in		unsigned int pushed);
600
601extern	__checkReturn	int
602hunt_tx_qpace(
603	__in		efx_txq_t *etp,
604	__in		unsigned int ns);
605
606extern	__checkReturn	int
607hunt_tx_qflush(
608	__in		efx_txq_t *etp);
609
610extern			void
611hunt_tx_qenable(
612	__in		efx_txq_t *etp);
613
614extern	__checkReturn	int
615hunt_tx_qpio_enable(
616	__in		efx_txq_t *etp);
617
618extern			void
619hunt_tx_qpio_disable(
620	__in		efx_txq_t *etp);
621
622extern	__checkReturn	int
623hunt_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
629extern	__checkReturn	int
630hunt_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
636extern	__checkReturn	int
637hunt_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
644extern	void
645hunt_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
652extern	void
653hunt_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
660extern	void
661hunt_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
669extern			void
670hunt_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
698typedef uint32_t	efx_piobuf_handle_t;
699
700#define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
701
702extern	__checkReturn	int
703hunt_nic_pio_alloc(
704	__inout		efx_nic_t *enp,
705	__out		uint32_t *bufnump,
706	__out		efx_piobuf_handle_t *handlep,
707	__out		uint32_t *blknump,
708	__out		uint32_t *offsetp,
709	__out		size_t *sizep);
710
711extern	__checkReturn	int
712hunt_nic_pio_free(
713	__inout		efx_nic_t *enp,
714	__in		uint32_t bufnum,
715	__in		uint32_t blknum);
716
717extern	__checkReturn	int
718hunt_nic_pio_link(
719	__inout		efx_nic_t *enp,
720	__in		uint32_t vi_index,
721	__in		efx_piobuf_handle_t handle);
722
723extern	__checkReturn	int
724hunt_nic_pio_unlink(
725	__inout		efx_nic_t *enp,
726	__in		uint32_t vi_index);
727
728
729/* VPD */
730
731#if EFSYS_OPT_VPD
732
733extern	__checkReturn		int
734hunt_vpd_init(
735	__in			efx_nic_t *enp);
736
737extern	__checkReturn		int
738hunt_vpd_size(
739	__in			efx_nic_t *enp,
740	__out			size_t *sizep);
741
742extern	__checkReturn		int
743hunt_vpd_read(
744	__in			efx_nic_t *enp,
745	__out_bcount(size)	caddr_t data,
746	__in			size_t size);
747
748extern	__checkReturn		int
749hunt_vpd_verify(
750	__in			efx_nic_t *enp,
751	__in_bcount(size)	caddr_t data,
752	__in			size_t size);
753
754extern	__checkReturn		int
755hunt_vpd_reinit(
756	__in			efx_nic_t *enp,
757	__in_bcount(size)	caddr_t data,
758	__in			size_t size);
759
760extern	__checkReturn		int
761hunt_vpd_get(
762	__in			efx_nic_t *enp,
763	__in_bcount(size)	caddr_t data,
764	__in			size_t size,
765	__inout			efx_vpd_value_t *evvp);
766
767extern	__checkReturn		int
768hunt_vpd_set(
769	__in			efx_nic_t *enp,
770	__in_bcount(size)	caddr_t data,
771	__in			size_t size,
772	__in			efx_vpd_value_t *evvp);
773
774extern	__checkReturn		int
775hunt_vpd_next(
776	__in			efx_nic_t *enp,
777	__in_bcount(size)	caddr_t data,
778	__in			size_t size,
779	__out			efx_vpd_value_t *evvp,
780	__inout			unsigned int *contp);
781
782extern __checkReturn		int
783hunt_vpd_write(
784	__in			efx_nic_t *enp,
785	__in_bcount(size)	caddr_t data,
786	__in			size_t size);
787
788extern				void
789hunt_vpd_fini(
790	__in			efx_nic_t *enp);
791
792#endif	/* EFSYS_OPT_VPD */
793
794
795/* RX */
796
797extern	__checkReturn	int
798hunt_rx_init(
799	__in		efx_nic_t *enp);
800
801#if EFSYS_OPT_RX_HDR_SPLIT
802extern	__checkReturn	int
803hunt_rx_hdr_split_enable(
804	__in		efx_nic_t *enp,
805	__in		unsigned int hdr_buf_size,
806	__in		unsigned int pld_buf_size);
807#endif	/* EFSYS_OPT_RX_HDR_SPLIT */
808
809#if EFSYS_OPT_RX_SCATTER
810extern	__checkReturn	int
811hunt_rx_scatter_enable(
812	__in		efx_nic_t *enp,
813	__in		unsigned int buf_size);
814#endif	/* EFSYS_OPT_RX_SCATTER */
815
816
817#if EFSYS_OPT_RX_SCALE
818
819extern	__checkReturn	int
820hunt_rx_scale_mode_set(
821	__in		efx_nic_t *enp,
822	__in		efx_rx_hash_alg_t alg,
823	__in		efx_rx_hash_type_t type,
824	__in		boolean_t insert);
825
826extern	__checkReturn	int
827hunt_rx_scale_key_set(
828	__in		efx_nic_t *enp,
829	__in_ecount(n)	uint8_t *key,
830	__in		size_t n);
831
832extern	__checkReturn	int
833hunt_rx_scale_tbl_set(
834	__in		efx_nic_t *enp,
835	__in_ecount(n)	unsigned int *table,
836	__in		size_t n);
837
838#endif /* EFSYS_OPT_RX_SCALE */
839
840extern			void
841hunt_rx_qpost(
842	__in		efx_rxq_t *erp,
843	__in_ecount(n)	efsys_dma_addr_t *addrp,
844	__in		size_t size,
845	__in		unsigned int n,
846	__in		unsigned int completed,
847	__in		unsigned int added);
848
849extern			void
850hunt_rx_qpush(
851	__in		efx_rxq_t *erp,
852	__in		unsigned int added,
853	__inout		unsigned int *pushedp);
854
855extern	__checkReturn	int
856hunt_rx_qflush(
857	__in		efx_rxq_t *erp);
858
859extern		void
860hunt_rx_qenable(
861	__in		efx_rxq_t *erp);
862
863extern	__checkReturn	int
864hunt_rx_qcreate(
865	__in		efx_nic_t *enp,
866	__in		unsigned int index,
867	__in		unsigned int label,
868	__in		efx_rxq_type_t type,
869	__in		efsys_mem_t *esmp,
870	__in		size_t n,
871	__in		uint32_t id,
872	__in		efx_evq_t *eep,
873	__in		efx_rxq_t *erp);
874
875extern			void
876hunt_rx_qdestroy(
877	__in		efx_rxq_t *erp);
878
879extern			void
880hunt_rx_fini(
881	__in		efx_nic_t *enp);
882
883#if EFSYS_OPT_FILTER
884
885typedef struct hunt_filter_handle_s {
886	uint32_t	hfh_lo;
887	uint32_t	hfh_hi;
888} hunt_filter_handle_t;
889
890typedef struct hunt_filter_entry_s {
891	uintptr_t hfe_spec; /* pointer to filter spec plus busy bit */
892	hunt_filter_handle_t hfe_handle;
893} hunt_filter_entry_t;
894
895/*
896 * BUSY flag indicates that an update is in progress.
897 * AUTO_OLD flag is used to mark and sweep MAC packet filters.
898 */
899#define	EFX_HUNT_FILTER_FLAG_BUSY	1U
900#define	EFX_HUNT_FILTER_FLAG_AUTO_OLD	2U
901#define	EFX_HUNT_FILTER_FLAGS		3U
902
903#define	EFX_HUNT_FILTER_TBL_ROWS 8192
904
905/* Allow for the broadcast address to be added to the multicast list */
906#define	EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
907
908typedef struct hunt_filter_table_s {
909	hunt_filter_entry_t	hft_entry[EFX_HUNT_FILTER_TBL_ROWS];
910	efx_rxq_t *		hft_default_rxq;
911	boolean_t 		hft_using_rss;
912	uint32_t 		hft_unicst_filter_index;
913	boolean_t 		hft_unicst_filter_set;
914	uint32_t 		hft_mulcst_filter_indexes[
915	    EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX];
916	uint32_t 		hft_mulcst_filter_count;
917} hunt_filter_table_t;
918
919	__checkReturn	int
920hunt_filter_init(
921	__in		efx_nic_t *enp);
922
923			void
924hunt_filter_fini(
925	__in		efx_nic_t *enp);
926
927	__checkReturn	int
928hunt_filter_restore(
929	__in		efx_nic_t *enp);
930
931	__checkReturn	int
932hunt_filter_add(
933	__in		efx_nic_t *enp,
934	__inout		efx_filter_spec_t *spec,
935	__in		boolean_t may_replace);
936
937	__checkReturn	int
938hunt_filter_delete(
939	__in		efx_nic_t *enp,
940	__inout		efx_filter_spec_t *spec);
941
942extern	__checkReturn	int
943hunt_filter_supported_filters(
944	__in		efx_nic_t *enp,
945	__out		uint32_t *list,
946	__out		size_t *length);
947
948extern	__checkReturn	int
949hunt_filter_reconfigure(
950	__in				efx_nic_t *enp,
951	__in_ecount(6)			uint8_t const *mac_addr,
952	__in				boolean_t all_unicst,
953	__in				boolean_t mulcst,
954	__in				boolean_t all_mulcst,
955	__in				boolean_t brdcst,
956	__in_ecount(6*count)		uint8_t const *addrs,
957	__in				int count);
958
959extern		void
960hunt_filter_get_default_rxq(
961	__in		efx_nic_t *enp,
962	__out		efx_rxq_t **erpp,
963	__out		boolean_t *using_rss);
964
965extern		void
966hunt_filter_default_rxq_set(
967	__in		efx_nic_t *enp,
968	__in		efx_rxq_t *erp,
969	__in		boolean_t using_rss);
970
971extern		void
972hunt_filter_default_rxq_clear(
973	__in		efx_nic_t *enp);
974
975
976#endif /* EFSYS_OPT_FILTER */
977
978extern	__checkReturn			int
979hunt_pktfilter_set(
980	__in				efx_nic_t *enp,
981	__in				boolean_t unicst,
982	__in				boolean_t brdcst);
983
984#if EFSYS_OPT_MCAST_FILTER_LIST
985
986extern	__checkReturn			int
987hunt_pktfilter_mcast_set(
988	__in				efx_nic_t *enp,
989	__in				uint8_t const *addrs,
990	__in				int count);
991
992#endif /* EFSYS_OPT_MCAST_FILTER_LIST */
993
994extern	__checkReturn			int
995hunt_pktfilter_mcast_all(
996	__in				efx_nic_t *enp);
997
998extern	__checkReturn			int
999efx_mcdi_get_function_info(
1000	__in				efx_nic_t *enp,
1001	__out				uint32_t *pfp,
1002	__out_opt			uint32_t *vfp);
1003
1004extern	__checkReturn		int
1005efx_mcdi_privilege_mask(
1006	__in			efx_nic_t *enp,
1007	__in			uint32_t pf,
1008	__in			uint32_t vf,
1009	__out			uint32_t *maskp);
1010
1011#ifdef	__cplusplus
1012}
1013#endif
1014
1015#endif	/* _SYS_HUNT_IMPL_H */
1016