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