xref: /freebsd/sys/dev/sfxge/common/hunt_impl.h (revision 1f4bcc459a76b7aa664f3fd557684cd0ba6da352)
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 #endif	/* EFSYS_OPT_NVRAM */
462 
463 
464 /* PHY */
465 
466 typedef struct ef10_link_state_s {
467 	uint32_t		els_adv_cap_mask;
468 	uint32_t		els_lp_cap_mask;
469 	unsigned int		els_fcntl;
470 	efx_link_mode_t		els_link_mode;
471 #if EFSYS_OPT_LOOPBACK
472 	efx_loopback_type_t	els_loopback;
473 #endif
474 	boolean_t		els_mac_up;
475 } ef10_link_state_t;
476 
477 extern			void
478 ef10_phy_link_ev(
479 	__in		efx_nic_t *enp,
480 	__in		efx_qword_t *eqp,
481 	__out		efx_link_mode_t *link_modep);
482 
483 extern	__checkReturn	efx_rc_t
484 ef10_phy_get_link(
485 	__in		efx_nic_t *enp,
486 	__out		ef10_link_state_t *elsp);
487 
488 extern	__checkReturn	efx_rc_t
489 ef10_phy_power(
490 	__in		efx_nic_t *enp,
491 	__in		boolean_t on);
492 
493 extern	__checkReturn	efx_rc_t
494 ef10_phy_reconfigure(
495 	__in		efx_nic_t *enp);
496 
497 extern	__checkReturn	efx_rc_t
498 ef10_phy_verify(
499 	__in		efx_nic_t *enp);
500 
501 extern	__checkReturn	efx_rc_t
502 ef10_phy_oui_get(
503 	__in		efx_nic_t *enp,
504 	__out		uint32_t *ouip);
505 
506 #if EFSYS_OPT_PHY_STATS
507 
508 extern	__checkReturn			efx_rc_t
509 ef10_phy_stats_update(
510 	__in				efx_nic_t *enp,
511 	__in				efsys_mem_t *esmp,
512 	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
513 
514 #endif	/* EFSYS_OPT_PHY_STATS */
515 
516 #if EFSYS_OPT_PHY_PROPS
517 
518 #if EFSYS_OPT_NAMES
519 
520 extern		const char *
521 ef10_phy_prop_name(
522 	__in	efx_nic_t *enp,
523 	__in	unsigned int id);
524 
525 #endif	/* EFSYS_OPT_NAMES */
526 
527 extern	__checkReturn	efx_rc_t
528 ef10_phy_prop_get(
529 	__in		efx_nic_t *enp,
530 	__in		unsigned int id,
531 	__in		uint32_t flags,
532 	__out		uint32_t *valp);
533 
534 extern	__checkReturn	efx_rc_t
535 ef10_phy_prop_set(
536 	__in		efx_nic_t *enp,
537 	__in		unsigned int id,
538 	__in		uint32_t val);
539 
540 #endif	/* EFSYS_OPT_PHY_PROPS */
541 
542 #if EFSYS_OPT_BIST
543 
544 extern	__checkReturn		efx_rc_t
545 hunt_bist_enable_offline(
546 	__in			efx_nic_t *enp);
547 
548 extern	__checkReturn		efx_rc_t
549 hunt_bist_start(
550 	__in			efx_nic_t *enp,
551 	__in			efx_bist_type_t type);
552 
553 extern	__checkReturn		efx_rc_t
554 hunt_bist_poll(
555 	__in			efx_nic_t *enp,
556 	__in			efx_bist_type_t type,
557 	__out			efx_bist_result_t *resultp,
558 	__out_opt __drv_when(count > 0, __notnull)
559 	uint32_t 	*value_maskp,
560 	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
561 	unsigned long	*valuesp,
562 	__in			size_t count);
563 
564 extern				void
565 hunt_bist_stop(
566 	__in			efx_nic_t *enp,
567 	__in			efx_bist_type_t type);
568 
569 #endif	/* EFSYS_OPT_BIST */
570 
571 
572 /* SRAM */
573 
574 #if EFSYS_OPT_DIAG
575 
576 extern	__checkReturn	efx_rc_t
577 ef10_sram_test(
578 	__in		efx_nic_t *enp,
579 	__in		efx_sram_pattern_fn_t func);
580 
581 #endif	/* EFSYS_OPT_DIAG */
582 
583 
584 /* TX */
585 
586 extern	__checkReturn	efx_rc_t
587 ef10_tx_init(
588 	__in		efx_nic_t *enp);
589 
590 extern			void
591 ef10_tx_fini(
592 	__in		efx_nic_t *enp);
593 
594 extern	__checkReturn	efx_rc_t
595 ef10_tx_qcreate(
596 	__in		efx_nic_t *enp,
597 	__in		unsigned int index,
598 	__in		unsigned int label,
599 	__in		efsys_mem_t *esmp,
600 	__in		size_t n,
601 	__in		uint32_t id,
602 	__in		uint16_t flags,
603 	__in		efx_evq_t *eep,
604 	__in		efx_txq_t *etp,
605 	__out		unsigned int *addedp);
606 
607 extern		void
608 ef10_tx_qdestroy(
609 	__in		efx_txq_t *etp);
610 
611 extern	__checkReturn	efx_rc_t
612 ef10_tx_qpost(
613 	__in		efx_txq_t *etp,
614 	__in_ecount(n)	efx_buffer_t *eb,
615 	__in		unsigned int n,
616 	__in		unsigned int completed,
617 	__inout		unsigned int *addedp);
618 
619 extern			void
620 ef10_tx_qpush(
621 	__in		efx_txq_t *etp,
622 	__in		unsigned int added,
623 	__in		unsigned int pushed);
624 
625 extern	__checkReturn	efx_rc_t
626 ef10_tx_qpace(
627 	__in		efx_txq_t *etp,
628 	__in		unsigned int ns);
629 
630 extern	__checkReturn	efx_rc_t
631 ef10_tx_qflush(
632 	__in		efx_txq_t *etp);
633 
634 extern			void
635 ef10_tx_qenable(
636 	__in		efx_txq_t *etp);
637 
638 extern	__checkReturn	efx_rc_t
639 ef10_tx_qpio_enable(
640 	__in		efx_txq_t *etp);
641 
642 extern			void
643 ef10_tx_qpio_disable(
644 	__in		efx_txq_t *etp);
645 
646 extern	__checkReturn	efx_rc_t
647 ef10_tx_qpio_write(
648 	__in			efx_txq_t *etp,
649 	__in_ecount(buf_length)	uint8_t *buffer,
650 	__in			size_t buf_length,
651 	__in                    size_t pio_buf_offset);
652 
653 extern	__checkReturn	efx_rc_t
654 ef10_tx_qpio_post(
655 	__in			efx_txq_t *etp,
656 	__in			size_t pkt_length,
657 	__in			unsigned int completed,
658 	__inout			unsigned int *addedp);
659 
660 extern	__checkReturn	efx_rc_t
661 ef10_tx_qdesc_post(
662 	__in		efx_txq_t *etp,
663 	__in_ecount(n)	efx_desc_t *ed,
664 	__in		unsigned int n,
665 	__in		unsigned int completed,
666 	__inout		unsigned int *addedp);
667 
668 extern	void
669 ef10_tx_qdesc_dma_create(
670 	__in	efx_txq_t *etp,
671 	__in	efsys_dma_addr_t addr,
672 	__in	size_t size,
673 	__in	boolean_t eop,
674 	__out	efx_desc_t *edp);
675 
676 extern	void
677 hunt_tx_qdesc_tso_create(
678 	__in	efx_txq_t *etp,
679 	__in	uint16_t ipv4_id,
680 	__in	uint32_t tcp_seq,
681 	__in	uint8_t  tcp_flags,
682 	__out	efx_desc_t *edp);
683 
684 extern	void
685 ef10_tx_qdesc_tso2_create(
686 	__in			efx_txq_t *etp,
687 	__in			uint16_t ipv4_id,
688 	__in			uint32_t tcp_seq,
689 	__in			uint16_t tcp_mss,
690 	__out_ecount(count)	efx_desc_t *edp,
691 	__in			int count);
692 
693 extern	void
694 ef10_tx_qdesc_vlantci_create(
695 	__in	efx_txq_t *etp,
696 	__in	uint16_t vlan_tci,
697 	__out	efx_desc_t *edp);
698 
699 
700 #if EFSYS_OPT_QSTATS
701 
702 extern			void
703 ef10_tx_qstats_update(
704 	__in				efx_txq_t *etp,
705 	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
706 
707 #endif /* EFSYS_OPT_QSTATS */
708 
709 /* PIO */
710 
711 /* Missing register definitions */
712 #ifndef	ER_DZ_TX_PIOBUF_OFST
713 #define	ER_DZ_TX_PIOBUF_OFST 0x00001000
714 #endif
715 #ifndef	ER_DZ_TX_PIOBUF_STEP
716 #define	ER_DZ_TX_PIOBUF_STEP 8192
717 #endif
718 #ifndef	ER_DZ_TX_PIOBUF_ROWS
719 #define	ER_DZ_TX_PIOBUF_ROWS 2048
720 #endif
721 
722 #ifndef	ER_DZ_TX_PIOBUF_SIZE
723 #define	ER_DZ_TX_PIOBUF_SIZE 2048
724 #endif
725 
726 #define	HUNT_PIOBUF_NBUFS	(16)
727 #define	HUNT_PIOBUF_SIZE	(ER_DZ_TX_PIOBUF_SIZE)
728 
729 #define	HUNT_MIN_PIO_ALLOC_SIZE	(HUNT_PIOBUF_SIZE / 32)
730 
731 #define	EF10_LEGACY_PF_PRIVILEGE_MASK					\
732 	(MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN			|	\
733 	MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK			|	\
734 	MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD			|	\
735 	MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP			|	\
736 	MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS		|	\
737 	MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING		|	\
738 	MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST			|	\
739 	MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST			|	\
740 	MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST			|	\
741 	MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST		|	\
742 	MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS)
743 
744 #define	EF10_LEGACY_VF_PRIVILEGE_MASK	0
745 
746 typedef uint32_t	efx_piobuf_handle_t;
747 
748 #define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
749 
750 extern	__checkReturn	efx_rc_t
751 ef10_nic_pio_alloc(
752 	__inout		efx_nic_t *enp,
753 	__out		uint32_t *bufnump,
754 	__out		efx_piobuf_handle_t *handlep,
755 	__out		uint32_t *blknump,
756 	__out		uint32_t *offsetp,
757 	__out		size_t *sizep);
758 
759 extern	__checkReturn	efx_rc_t
760 ef10_nic_pio_free(
761 	__inout		efx_nic_t *enp,
762 	__in		uint32_t bufnum,
763 	__in		uint32_t blknum);
764 
765 extern	__checkReturn	efx_rc_t
766 ef10_nic_pio_link(
767 	__inout		efx_nic_t *enp,
768 	__in		uint32_t vi_index,
769 	__in		efx_piobuf_handle_t handle);
770 
771 extern	__checkReturn	efx_rc_t
772 ef10_nic_pio_unlink(
773 	__inout		efx_nic_t *enp,
774 	__in		uint32_t vi_index);
775 
776 
777 /* VPD */
778 
779 #if EFSYS_OPT_VPD
780 
781 extern	__checkReturn		efx_rc_t
782 ef10_vpd_init(
783 	__in			efx_nic_t *enp);
784 
785 extern	__checkReturn		efx_rc_t
786 ef10_vpd_size(
787 	__in			efx_nic_t *enp,
788 	__out			size_t *sizep);
789 
790 extern	__checkReturn		efx_rc_t
791 ef10_vpd_read(
792 	__in			efx_nic_t *enp,
793 	__out_bcount(size)	caddr_t data,
794 	__in			size_t size);
795 
796 extern	__checkReturn		efx_rc_t
797 ef10_vpd_verify(
798 	__in			efx_nic_t *enp,
799 	__in_bcount(size)	caddr_t data,
800 	__in			size_t size);
801 
802 extern	__checkReturn		efx_rc_t
803 ef10_vpd_reinit(
804 	__in			efx_nic_t *enp,
805 	__in_bcount(size)	caddr_t data,
806 	__in			size_t size);
807 
808 extern	__checkReturn		efx_rc_t
809 ef10_vpd_get(
810 	__in			efx_nic_t *enp,
811 	__in_bcount(size)	caddr_t data,
812 	__in			size_t size,
813 	__inout			efx_vpd_value_t *evvp);
814 
815 extern	__checkReturn		efx_rc_t
816 ef10_vpd_set(
817 	__in			efx_nic_t *enp,
818 	__in_bcount(size)	caddr_t data,
819 	__in			size_t size,
820 	__in			efx_vpd_value_t *evvp);
821 
822 extern	__checkReturn		efx_rc_t
823 ef10_vpd_next(
824 	__in			efx_nic_t *enp,
825 	__in_bcount(size)	caddr_t data,
826 	__in			size_t size,
827 	__out			efx_vpd_value_t *evvp,
828 	__inout			unsigned int *contp);
829 
830 extern __checkReturn		efx_rc_t
831 ef10_vpd_write(
832 	__in			efx_nic_t *enp,
833 	__in_bcount(size)	caddr_t data,
834 	__in			size_t size);
835 
836 extern				void
837 ef10_vpd_fini(
838 	__in			efx_nic_t *enp);
839 
840 #endif	/* EFSYS_OPT_VPD */
841 
842 
843 /* RX */
844 
845 extern	__checkReturn	efx_rc_t
846 ef10_rx_init(
847 	__in		efx_nic_t *enp);
848 
849 #if EFSYS_OPT_RX_SCATTER
850 extern	__checkReturn	efx_rc_t
851 ef10_rx_scatter_enable(
852 	__in		efx_nic_t *enp,
853 	__in		unsigned int buf_size);
854 #endif	/* EFSYS_OPT_RX_SCATTER */
855 
856 
857 #if EFSYS_OPT_RX_SCALE
858 
859 extern	__checkReturn	efx_rc_t
860 ef10_rx_scale_mode_set(
861 	__in		efx_nic_t *enp,
862 	__in		efx_rx_hash_alg_t alg,
863 	__in		efx_rx_hash_type_t type,
864 	__in		boolean_t insert);
865 
866 extern	__checkReturn	efx_rc_t
867 ef10_rx_scale_key_set(
868 	__in		efx_nic_t *enp,
869 	__in_ecount(n)	uint8_t *key,
870 	__in		size_t n);
871 
872 extern	__checkReturn	efx_rc_t
873 ef10_rx_scale_tbl_set(
874 	__in		efx_nic_t *enp,
875 	__in_ecount(n)	unsigned int *table,
876 	__in		size_t n);
877 
878 extern	__checkReturn	uint32_t
879 ef10_rx_prefix_hash(
880 	__in		efx_nic_t *enp,
881 	__in		efx_rx_hash_alg_t func,
882 	__in		uint8_t *buffer);
883 
884 #endif /* EFSYS_OPT_RX_SCALE */
885 
886 extern	__checkReturn	efx_rc_t
887 ef10_rx_prefix_pktlen(
888 	__in		efx_nic_t *enp,
889 	__in		uint8_t *buffer,
890 	__out		uint16_t *lengthp);
891 
892 extern			void
893 ef10_rx_qpost(
894 	__in		efx_rxq_t *erp,
895 	__in_ecount(n)	efsys_dma_addr_t *addrp,
896 	__in		size_t size,
897 	__in		unsigned int n,
898 	__in		unsigned int completed,
899 	__in		unsigned int added);
900 
901 extern			void
902 ef10_rx_qpush(
903 	__in		efx_rxq_t *erp,
904 	__in		unsigned int added,
905 	__inout		unsigned int *pushedp);
906 
907 extern	__checkReturn	efx_rc_t
908 ef10_rx_qflush(
909 	__in		efx_rxq_t *erp);
910 
911 extern		void
912 ef10_rx_qenable(
913 	__in		efx_rxq_t *erp);
914 
915 extern	__checkReturn	efx_rc_t
916 ef10_rx_qcreate(
917 	__in		efx_nic_t *enp,
918 	__in		unsigned int index,
919 	__in		unsigned int label,
920 	__in		efx_rxq_type_t type,
921 	__in		efsys_mem_t *esmp,
922 	__in		size_t n,
923 	__in		uint32_t id,
924 	__in		efx_evq_t *eep,
925 	__in		efx_rxq_t *erp);
926 
927 extern			void
928 ef10_rx_qdestroy(
929 	__in		efx_rxq_t *erp);
930 
931 extern			void
932 ef10_rx_fini(
933 	__in		efx_nic_t *enp);
934 
935 #if EFSYS_OPT_FILTER
936 
937 typedef struct ef10_filter_handle_s {
938 	uint32_t	efh_lo;
939 	uint32_t	efh_hi;
940 } ef10_filter_handle_t;
941 
942 typedef struct ef10_filter_entry_s {
943 	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
944 	ef10_filter_handle_t efe_handle;
945 } ef10_filter_entry_t;
946 
947 /*
948  * BUSY flag indicates that an update is in progress.
949  * AUTO_OLD flag is used to mark and sweep MAC packet filters.
950  */
951 #define	EFX_EF10_FILTER_FLAG_BUSY	1U
952 #define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
953 #define	EFX_EF10_FILTER_FLAGS		3U
954 
955 /*
956  * Size of the hash table used by the driver. Doesn't need to be the
957  * same size as the hardware's table.
958  */
959 #define	EFX_EF10_FILTER_TBL_ROWS 8192
960 
961 /* Allow for the broadcast address to be added to the multicast list */
962 #define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
963 
964 typedef struct ef10_filter_table_s {
965 	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
966 	efx_rxq_t *		eft_default_rxq;
967 	boolean_t 		eft_using_rss;
968 	uint32_t 		eft_unicst_filter_index;
969 	boolean_t 		eft_unicst_filter_set;
970 	uint32_t 		eft_mulcst_filter_indexes[
971 	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
972 	uint32_t 		eft_mulcst_filter_count;
973 } ef10_filter_table_t;
974 
975 	__checkReturn	efx_rc_t
976 ef10_filter_init(
977 	__in		efx_nic_t *enp);
978 
979 			void
980 ef10_filter_fini(
981 	__in		efx_nic_t *enp);
982 
983 	__checkReturn	efx_rc_t
984 ef10_filter_restore(
985 	__in		efx_nic_t *enp);
986 
987 	__checkReturn	efx_rc_t
988 ef10_filter_add(
989 	__in		efx_nic_t *enp,
990 	__inout		efx_filter_spec_t *spec,
991 	__in		boolean_t may_replace);
992 
993 	__checkReturn	efx_rc_t
994 ef10_filter_delete(
995 	__in		efx_nic_t *enp,
996 	__inout		efx_filter_spec_t *spec);
997 
998 extern	__checkReturn	efx_rc_t
999 ef10_filter_supported_filters(
1000 	__in		efx_nic_t *enp,
1001 	__out		uint32_t *list,
1002 	__out		size_t *length);
1003 
1004 extern	__checkReturn	efx_rc_t
1005 ef10_filter_reconfigure(
1006 	__in				efx_nic_t *enp,
1007 	__in_ecount(6)			uint8_t const *mac_addr,
1008 	__in				boolean_t all_unicst,
1009 	__in				boolean_t mulcst,
1010 	__in				boolean_t all_mulcst,
1011 	__in				boolean_t brdcst,
1012 	__in_ecount(6*count)		uint8_t const *addrs,
1013 	__in				int count);
1014 
1015 extern		void
1016 ef10_filter_get_default_rxq(
1017 	__in		efx_nic_t *enp,
1018 	__out		efx_rxq_t **erpp,
1019 	__out		boolean_t *using_rss);
1020 
1021 extern		void
1022 ef10_filter_default_rxq_set(
1023 	__in		efx_nic_t *enp,
1024 	__in		efx_rxq_t *erp,
1025 	__in		boolean_t using_rss);
1026 
1027 extern		void
1028 ef10_filter_default_rxq_clear(
1029 	__in		efx_nic_t *enp);
1030 
1031 
1032 #endif /* EFSYS_OPT_FILTER */
1033 
1034 extern	__checkReturn			efx_rc_t
1035 efx_mcdi_get_function_info(
1036 	__in				efx_nic_t *enp,
1037 	__out				uint32_t *pfp,
1038 	__out_opt			uint32_t *vfp);
1039 
1040 extern	__checkReturn		efx_rc_t
1041 efx_mcdi_privilege_mask(
1042 	__in			efx_nic_t *enp,
1043 	__in			uint32_t pf,
1044 	__in			uint32_t vf,
1045 	__out			uint32_t *maskp);
1046 
1047 #ifdef	__cplusplus
1048 }
1049 #endif
1050 
1051 #endif	/* _SYS_HUNT_IMPL_H */
1052