ef10_impl.h revision 299720
1293734Sarybchik/*-
2293734Sarybchik * Copyright (c) 2015 Solarflare Communications Inc.
3293734Sarybchik * All rights reserved.
4293734Sarybchik *
5293734Sarybchik * Redistribution and use in source and binary forms, with or without
6293734Sarybchik * modification, are permitted provided that the following conditions are met:
7293734Sarybchik *
8293734Sarybchik * 1. Redistributions of source code must retain the above copyright notice,
9293734Sarybchik *    this list of conditions and the following disclaimer.
10293734Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice,
11293734Sarybchik *    this list of conditions and the following disclaimer in the documentation
12293734Sarybchik *    and/or other materials provided with the distribution.
13293734Sarybchik *
14293734Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15293734Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16293734Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17293734Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18293734Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19293734Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20293734Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21293734Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22293734Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23293734Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24293734Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25293734Sarybchik *
26293734Sarybchik * The views and conclusions contained in the software and documentation are
27293734Sarybchik * those of the authors and should not be interpreted as representing official
28293734Sarybchik * policies, either expressed or implied, of the FreeBSD Project.
29293734Sarybchik *
30293734Sarybchik * $FreeBSD: head/sys/dev/sfxge/common/ef10_impl.h 299720 2016-05-14 06:02:00Z arybchik $
31293734Sarybchik */
32293734Sarybchik
33293734Sarybchik#ifndef	_SYS_EF10_IMPL_H
34293734Sarybchik#define	_SYS_EF10_IMPL_H
35293734Sarybchik
36293734Sarybchik#ifdef	__cplusplus
37293734Sarybchikextern "C" {
38293734Sarybchik#endif
39293734Sarybchik
40293748Sarybchik#if (EFSYS_OPT_HUNTINGTON && EFSYS_OPT_MEDFORD)
41293748Sarybchik#define	EF10_MAX_PIOBUF_NBUFS	MAX(HUNT_PIOBUF_NBUFS, MEDFORD_PIOBUF_NBUFS)
42293748Sarybchik#elif EFSYS_OPT_HUNTINGTON
43293748Sarybchik#define	EF10_MAX_PIOBUF_NBUFS	HUNT_PIOBUF_NBUFS
44293748Sarybchik#elif EFSYS_OPT_MEDFORD
45293748Sarybchik#define	EF10_MAX_PIOBUF_NBUFS	MEDFORD_PIOBUF_NBUFS
46293748Sarybchik#endif
47293734Sarybchik
48299720Sarybchik/*
49299720Sarybchik * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could
50299720Sarybchik * possibly be increased, or the write size reported by newer firmware used
51299720Sarybchik * instead.
52299720Sarybchik */
53299720Sarybchik#define	EF10_NVRAM_CHUNK 0x80
54299720Sarybchik
55299720Sarybchik/* Alignment requirement for value written to RX WPTR:
56299720Sarybchik *  the WPTR must be aligned to an 8 descriptor boundary
57299720Sarybchik */
58299720Sarybchik#define	EF10_RX_WPTR_ALIGN 8
59299720Sarybchik
60299720Sarybchik/*
61299720Sarybchik * Max byte offset into the packet the TCP header must start for the hardware
62299720Sarybchik * to be able to parse the packet correctly.
63299720Sarybchik */
64299720Sarybchik#define	EF10_TCP_HEADER_OFFSET_LIMIT	208
65299720Sarybchik
66299720Sarybchik/* Invalid RSS context handle */
67299720Sarybchik#define	EF10_RSS_CONTEXT_INVALID	(0xffffffff)
68299720Sarybchik
69299720Sarybchik
70299720Sarybchik/* EV */
71299720Sarybchik
72299720Sarybchik	__checkReturn	efx_rc_t
73299720Sarybchikef10_ev_init(
74299720Sarybchik	__in		efx_nic_t *enp);
75299720Sarybchik
76299720Sarybchik			void
77299720Sarybchikef10_ev_fini(
78299720Sarybchik	__in		efx_nic_t *enp);
79299720Sarybchik
80299720Sarybchik	__checkReturn	efx_rc_t
81299720Sarybchikef10_ev_qcreate(
82299720Sarybchik	__in		efx_nic_t *enp,
83299720Sarybchik	__in		unsigned int index,
84299720Sarybchik	__in		efsys_mem_t *esmp,
85299720Sarybchik	__in		size_t n,
86299720Sarybchik	__in		uint32_t id,
87299720Sarybchik	__in		efx_evq_t *eep);
88299720Sarybchik
89299720Sarybchik			void
90299720Sarybchikef10_ev_qdestroy(
91299720Sarybchik	__in		efx_evq_t *eep);
92299720Sarybchik
93299720Sarybchik	__checkReturn	efx_rc_t
94299720Sarybchikef10_ev_qprime(
95299720Sarybchik	__in		efx_evq_t *eep,
96299720Sarybchik	__in		unsigned int count);
97299720Sarybchik
98299720Sarybchik			void
99299720Sarybchikef10_ev_qpost(
100299720Sarybchik	__in	efx_evq_t *eep,
101299720Sarybchik	__in	uint16_t data);
102299720Sarybchik
103299720Sarybchik	__checkReturn	efx_rc_t
104299720Sarybchikef10_ev_qmoderate(
105299720Sarybchik	__in		efx_evq_t *eep,
106299720Sarybchik	__in		unsigned int us);
107299720Sarybchik
108299720Sarybchik#if EFSYS_OPT_QSTATS
109299720Sarybchik			void
110299720Sarybchikef10_ev_qstats_update(
111299720Sarybchik	__in				efx_evq_t *eep,
112299720Sarybchik	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
113299720Sarybchik#endif /* EFSYS_OPT_QSTATS */
114299720Sarybchik
115299720Sarybchik		void
116299720Sarybchikef10_ev_rxlabel_init(
117299720Sarybchik	__in		efx_evq_t *eep,
118299720Sarybchik	__in		efx_rxq_t *erp,
119299720Sarybchik	__in		unsigned int label);
120299720Sarybchik
121299720Sarybchik		void
122299720Sarybchikef10_ev_rxlabel_fini(
123299720Sarybchik	__in		efx_evq_t *eep,
124299720Sarybchik	__in		unsigned int label);
125299720Sarybchik
126299720Sarybchik/* INTR */
127299720Sarybchik
128299720Sarybchik	__checkReturn	efx_rc_t
129299720Sarybchikef10_intr_init(
130299720Sarybchik	__in		efx_nic_t *enp,
131299720Sarybchik	__in		efx_intr_type_t type,
132299720Sarybchik	__in		efsys_mem_t *esmp);
133299720Sarybchik
134299720Sarybchik			void
135299720Sarybchikef10_intr_enable(
136299720Sarybchik	__in		efx_nic_t *enp);
137299720Sarybchik
138299720Sarybchik			void
139299720Sarybchikef10_intr_disable(
140299720Sarybchik	__in		efx_nic_t *enp);
141299720Sarybchik
142299720Sarybchik			void
143299720Sarybchikef10_intr_disable_unlocked(
144299720Sarybchik	__in		efx_nic_t *enp);
145299720Sarybchik
146299720Sarybchik	__checkReturn	efx_rc_t
147299720Sarybchikef10_intr_trigger(
148299720Sarybchik	__in		efx_nic_t *enp,
149299720Sarybchik	__in		unsigned int level);
150299720Sarybchik
151299720Sarybchik			void
152299720Sarybchikef10_intr_status_line(
153299720Sarybchik	__in		efx_nic_t *enp,
154299720Sarybchik	__out		boolean_t *fatalp,
155299720Sarybchik	__out		uint32_t *qmaskp);
156299720Sarybchik
157299720Sarybchik			void
158299720Sarybchikef10_intr_status_message(
159299720Sarybchik	__in		efx_nic_t *enp,
160299720Sarybchik	__in		unsigned int message,
161299720Sarybchik	__out		boolean_t *fatalp);
162299720Sarybchik
163299720Sarybchik			void
164299720Sarybchikef10_intr_fatal(
165299720Sarybchik	__in		efx_nic_t *enp);
166299720Sarybchik			void
167299720Sarybchikef10_intr_fini(
168299720Sarybchik	__in		efx_nic_t *enp);
169299720Sarybchik
170299720Sarybchik/* NIC */
171299720Sarybchik
172293887Sarybchikextern	__checkReturn	efx_rc_t
173299720Sarybchikef10_nic_probe(
174299720Sarybchik	__in		efx_nic_t *enp);
175299720Sarybchik
176299720Sarybchikextern	__checkReturn	efx_rc_t
177299720Sarybchikef10_nic_set_drv_limits(
178299720Sarybchik	__inout		efx_nic_t *enp,
179299720Sarybchik	__in		efx_drv_limits_t *edlp);
180299720Sarybchik
181299720Sarybchikextern	__checkReturn	efx_rc_t
182299720Sarybchikef10_nic_get_vi_pool(
183299720Sarybchik	__in		efx_nic_t *enp,
184299720Sarybchik	__out		uint32_t *vi_countp);
185299720Sarybchik
186299720Sarybchikextern	__checkReturn	efx_rc_t
187299720Sarybchikef10_nic_get_bar_region(
188299720Sarybchik	__in		efx_nic_t *enp,
189299720Sarybchik	__in		efx_nic_region_t region,
190299720Sarybchik	__out		uint32_t *offsetp,
191299720Sarybchik	__out		size_t *sizep);
192299720Sarybchik
193299720Sarybchikextern	__checkReturn	efx_rc_t
194299720Sarybchikef10_nic_reset(
195299720Sarybchik	__in		efx_nic_t *enp);
196299720Sarybchik
197299720Sarybchikextern	__checkReturn	efx_rc_t
198299720Sarybchikef10_nic_init(
199299720Sarybchik	__in		efx_nic_t *enp);
200299720Sarybchik
201299720Sarybchik#if EFSYS_OPT_DIAG
202299720Sarybchik
203299720Sarybchikextern	__checkReturn	efx_rc_t
204299720Sarybchikef10_nic_register_test(
205299720Sarybchik	__in		efx_nic_t *enp);
206299720Sarybchik
207299720Sarybchik#endif	/* EFSYS_OPT_DIAG */
208299720Sarybchik
209299720Sarybchikextern			void
210299720Sarybchikef10_nic_fini(
211299720Sarybchik	__in		efx_nic_t *enp);
212299720Sarybchik
213299720Sarybchikextern			void
214299720Sarybchikef10_nic_unprobe(
215299720Sarybchik	__in		efx_nic_t *enp);
216299720Sarybchik
217299720Sarybchik
218299720Sarybchik/* MAC */
219299720Sarybchik
220299720Sarybchikextern	__checkReturn	efx_rc_t
221299720Sarybchikef10_mac_poll(
222299720Sarybchik	__in		efx_nic_t *enp,
223299720Sarybchik	__out		efx_link_mode_t *link_modep);
224299720Sarybchik
225299720Sarybchikextern	__checkReturn	efx_rc_t
226299720Sarybchikef10_mac_up(
227299720Sarybchik	__in		efx_nic_t *enp,
228299720Sarybchik	__out		boolean_t *mac_upp);
229299720Sarybchik
230299720Sarybchikextern	__checkReturn	efx_rc_t
231299720Sarybchikef10_mac_addr_set(
232299720Sarybchik	__in	efx_nic_t *enp);
233299720Sarybchik
234299720Sarybchikextern	__checkReturn	efx_rc_t
235299720Sarybchikef10_mac_pdu_set(
236299720Sarybchik	__in	efx_nic_t *enp);
237299720Sarybchik
238299720Sarybchikextern	__checkReturn	efx_rc_t
239299720Sarybchikef10_mac_reconfigure(
240299720Sarybchik	__in	efx_nic_t *enp);
241299720Sarybchik
242299720Sarybchikextern	__checkReturn	efx_rc_t
243299720Sarybchikef10_mac_multicast_list_set(
244299720Sarybchik	__in				efx_nic_t *enp);
245299720Sarybchik
246299720Sarybchikextern	__checkReturn	efx_rc_t
247299720Sarybchikef10_mac_filter_default_rxq_set(
248299720Sarybchik	__in		efx_nic_t *enp,
249299720Sarybchik	__in		efx_rxq_t *erp,
250299720Sarybchik	__in		boolean_t using_rss);
251299720Sarybchik
252299720Sarybchikextern			void
253299720Sarybchikef10_mac_filter_default_rxq_clear(
254299720Sarybchik	__in		efx_nic_t *enp);
255299720Sarybchik
256299720Sarybchik#if EFSYS_OPT_LOOPBACK
257299720Sarybchik
258299720Sarybchikextern	__checkReturn	efx_rc_t
259299720Sarybchikef10_mac_loopback_set(
260299720Sarybchik	__in		efx_nic_t *enp,
261299720Sarybchik	__in		efx_link_mode_t link_mode,
262299720Sarybchik	__in		efx_loopback_type_t loopback_type);
263299720Sarybchik
264299720Sarybchik#endif	/* EFSYS_OPT_LOOPBACK */
265299720Sarybchik
266299720Sarybchik#if EFSYS_OPT_MAC_STATS
267299720Sarybchik
268299720Sarybchikextern	__checkReturn			efx_rc_t
269299720Sarybchikef10_mac_stats_update(
270299720Sarybchik	__in				efx_nic_t *enp,
271299720Sarybchik	__in				efsys_mem_t *esmp,
272299720Sarybchik	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
273299720Sarybchik	__inout_opt			uint32_t *generationp);
274299720Sarybchik
275299720Sarybchik#endif	/* EFSYS_OPT_MAC_STATS */
276299720Sarybchik
277299720Sarybchik
278299720Sarybchik/* MCDI */
279299720Sarybchik
280299720Sarybchik#if EFSYS_OPT_MCDI
281299720Sarybchik
282299720Sarybchikextern	__checkReturn	efx_rc_t
283299720Sarybchikef10_mcdi_init(
284299720Sarybchik	__in		efx_nic_t *enp,
285299720Sarybchik	__in		const efx_mcdi_transport_t *mtp);
286299720Sarybchik
287299720Sarybchikextern			void
288299720Sarybchikef10_mcdi_fini(
289299720Sarybchik	__in		efx_nic_t *enp);
290299720Sarybchik
291299720Sarybchikextern			void
292299720Sarybchikef10_mcdi_send_request(
293299720Sarybchik	__in		efx_nic_t *enp,
294299720Sarybchik	__in		void *hdrp,
295299720Sarybchik	__in		size_t hdr_len,
296299720Sarybchik	__in		void *sdup,
297299720Sarybchik	__in		size_t sdu_len);
298299720Sarybchik
299299720Sarybchikextern	__checkReturn	boolean_t
300299720Sarybchikef10_mcdi_poll_response(
301299720Sarybchik	__in		efx_nic_t *enp);
302299720Sarybchik
303299720Sarybchikextern			void
304299720Sarybchikef10_mcdi_read_response(
305299720Sarybchik	__in			efx_nic_t *enp,
306299720Sarybchik	__out_bcount(length)	void *bufferp,
307299720Sarybchik	__in			size_t offset,
308299720Sarybchik	__in			size_t length);
309299720Sarybchik
310299720Sarybchikextern			efx_rc_t
311299720Sarybchikef10_mcdi_poll_reboot(
312299720Sarybchik	__in		efx_nic_t *enp);
313299720Sarybchik
314299720Sarybchikextern	__checkReturn	efx_rc_t
315299720Sarybchikef10_mcdi_feature_supported(
316299720Sarybchik	__in		efx_nic_t *enp,
317299720Sarybchik	__in		efx_mcdi_feature_id_t id,
318299720Sarybchik	__out		boolean_t *supportedp);
319299720Sarybchik
320299720Sarybchik#endif /* EFSYS_OPT_MCDI */
321299720Sarybchik
322299720Sarybchik/* NVRAM */
323299720Sarybchik
324299720Sarybchik#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
325299720Sarybchik
326299720Sarybchikextern	__checkReturn		efx_rc_t
327299720Sarybchikef10_nvram_buf_read_tlv(
328299720Sarybchik	__in				efx_nic_t *enp,
329299720Sarybchik	__in_bcount(max_seg_size)	caddr_t seg_data,
330299720Sarybchik	__in				size_t max_seg_size,
331299720Sarybchik	__in				uint32_t tag,
332299720Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
333299720Sarybchik	__out				size_t *sizep);
334299720Sarybchik
335299720Sarybchikextern	__checkReturn		efx_rc_t
336299720Sarybchikef10_nvram_buf_write_tlv(
337299720Sarybchik	__inout_bcount(partn_size)	caddr_t partn_data,
338299720Sarybchik	__in				size_t partn_size,
339299720Sarybchik	__in				uint32_t tag,
340299720Sarybchik	__in_bcount(tag_size)		caddr_t tag_data,
341299720Sarybchik	__in				size_t tag_size,
342299720Sarybchik	__out				size_t *total_lengthp);
343299720Sarybchik
344299720Sarybchikextern	__checkReturn		efx_rc_t
345299720Sarybchikef10_nvram_partn_read_tlv(
346299720Sarybchik	__in				efx_nic_t *enp,
347299720Sarybchik	__in				uint32_t partn,
348299720Sarybchik	__in				uint32_t tag,
349299720Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
350299720Sarybchik	__out				size_t *sizep);
351299720Sarybchik
352299720Sarybchikextern	__checkReturn		efx_rc_t
353299720Sarybchikef10_nvram_partn_write_tlv(
354299720Sarybchik	__in			efx_nic_t *enp,
355299720Sarybchik	__in			uint32_t partn,
356299720Sarybchik	__in			uint32_t tag,
357299720Sarybchik	__in_bcount(size)	caddr_t data,
358299720Sarybchik	__in			size_t size);
359299720Sarybchik
360299720Sarybchikextern	__checkReturn		efx_rc_t
361299720Sarybchikef10_nvram_partn_write_segment_tlv(
362299720Sarybchik	__in			efx_nic_t *enp,
363299720Sarybchik	__in			uint32_t partn,
364299720Sarybchik	__in			uint32_t tag,
365299720Sarybchik	__in_bcount(size)	caddr_t data,
366299720Sarybchik	__in			size_t size,
367299720Sarybchik	__in			boolean_t all_segments);
368299720Sarybchik
369299720Sarybchikextern	__checkReturn		efx_rc_t
370299720Sarybchikef10_nvram_partn_lock(
371299720Sarybchik	__in			efx_nic_t *enp,
372299720Sarybchik	__in			uint32_t partn);
373299720Sarybchik
374299720Sarybchikextern				void
375299720Sarybchikef10_nvram_partn_unlock(
376299720Sarybchik	__in			efx_nic_t *enp,
377299720Sarybchik	__in			uint32_t partn);
378299720Sarybchik
379299720Sarybchik#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
380299720Sarybchik
381299720Sarybchik#if EFSYS_OPT_NVRAM
382299720Sarybchik
383299720Sarybchik#if EFSYS_OPT_DIAG
384299720Sarybchik
385299720Sarybchikextern	__checkReturn		efx_rc_t
386299720Sarybchikef10_nvram_test(
387299720Sarybchik	__in			efx_nic_t *enp);
388299720Sarybchik
389299720Sarybchik#endif	/* EFSYS_OPT_DIAG */
390299720Sarybchik
391299720Sarybchikextern	__checkReturn		efx_rc_t
392299720Sarybchikef10_nvram_type_to_partn(
393299720Sarybchik	__in			efx_nic_t *enp,
394299720Sarybchik	__in			efx_nvram_type_t type,
395299720Sarybchik	__out			uint32_t *partnp);
396299720Sarybchik
397299720Sarybchikextern	__checkReturn		efx_rc_t
398299720Sarybchikef10_nvram_partn_size(
399299720Sarybchik	__in			efx_nic_t *enp,
400299720Sarybchik	__in			uint32_t partn,
401299720Sarybchik	__out			size_t *sizep);
402299720Sarybchik
403299720Sarybchikextern	__checkReturn		efx_rc_t
404299720Sarybchikef10_nvram_partn_rw_start(
405299720Sarybchik	__in			efx_nic_t *enp,
406299720Sarybchik	__in			uint32_t partn,
407299720Sarybchik	__out			size_t *chunk_sizep);
408299720Sarybchik
409299720Sarybchikextern	__checkReturn		efx_rc_t
410299720Sarybchikef10_nvram_partn_read_mode(
411299720Sarybchik	__in			efx_nic_t *enp,
412299720Sarybchik	__in			uint32_t partn,
413299720Sarybchik	__in			unsigned int offset,
414299720Sarybchik	__out_bcount(size)	caddr_t data,
415299720Sarybchik	__in			size_t size,
416299720Sarybchik	__in			uint32_t mode);
417299720Sarybchik
418299720Sarybchikextern	__checkReturn		efx_rc_t
419299720Sarybchikef10_nvram_partn_read(
420299720Sarybchik	__in			efx_nic_t *enp,
421299720Sarybchik	__in			uint32_t partn,
422299720Sarybchik	__in			unsigned int offset,
423299720Sarybchik	__out_bcount(size)	caddr_t data,
424299720Sarybchik	__in			size_t size);
425299720Sarybchik
426299720Sarybchikextern	__checkReturn		efx_rc_t
427299720Sarybchikef10_nvram_partn_erase(
428299720Sarybchik	__in			efx_nic_t *enp,
429299720Sarybchik	__in			uint32_t partn,
430299720Sarybchik	__in			unsigned int offset,
431299720Sarybchik	__in			size_t size);
432299720Sarybchik
433299720Sarybchikextern	__checkReturn		efx_rc_t
434299720Sarybchikef10_nvram_partn_write(
435299720Sarybchik	__in			efx_nic_t *enp,
436299720Sarybchik	__in			uint32_t partn,
437299720Sarybchik	__in			unsigned int offset,
438299720Sarybchik	__out_bcount(size)	caddr_t data,
439299720Sarybchik	__in			size_t size);
440299720Sarybchik
441299720Sarybchikextern				void
442299720Sarybchikef10_nvram_partn_rw_finish(
443299720Sarybchik	__in			efx_nic_t *enp,
444299720Sarybchik	__in			uint32_t partn);
445299720Sarybchik
446299720Sarybchikextern	__checkReturn		efx_rc_t
447299720Sarybchikef10_nvram_partn_get_version(
448299720Sarybchik	__in			efx_nic_t *enp,
449299720Sarybchik	__in			uint32_t partn,
450299720Sarybchik	__out			uint32_t *subtypep,
451299720Sarybchik	__out_ecount(4)		uint16_t version[4]);
452299720Sarybchik
453299720Sarybchikextern	__checkReturn		efx_rc_t
454299720Sarybchikef10_nvram_partn_set_version(
455299720Sarybchik	__in			efx_nic_t *enp,
456299720Sarybchik	__in			uint32_t partn,
457299720Sarybchik	__in_ecount(4)		uint16_t version[4]);
458299720Sarybchik
459299720Sarybchikextern	__checkReturn		efx_rc_t
460299720Sarybchikef10_nvram_buffer_validate(
461299720Sarybchik	__in			efx_nic_t *enp,
462299720Sarybchik	__in			uint32_t partn,
463299720Sarybchik	__in_bcount(buffer_size)
464299720Sarybchik				caddr_t bufferp,
465299720Sarybchik	__in			size_t buffer_size);
466299720Sarybchik
467299720Sarybchikextern	__checkReturn		efx_rc_t
468299720Sarybchikef10_nvram_buffer_create(
469299720Sarybchik	__in			efx_nic_t *enp,
470299720Sarybchik	__in			uint16_t partn_type,
471299720Sarybchik	__in_bcount(buffer_size)
472299720Sarybchik				caddr_t bufferp,
473299720Sarybchik	__in			size_t buffer_size);
474299720Sarybchik
475299720Sarybchikextern	__checkReturn		efx_rc_t
476299720Sarybchikef10_nvram_buffer_find_item_start(
477299720Sarybchik	__in_bcount(buffer_size)
478299720Sarybchik				caddr_t bufferp,
479299720Sarybchik	__in			size_t buffer_size,
480299720Sarybchik	__out			uint32_t *startp
481299720Sarybchik	);
482299720Sarybchik
483299720Sarybchikextern	__checkReturn		efx_rc_t
484299720Sarybchikef10_nvram_buffer_find_end(
485299720Sarybchik	__in_bcount(buffer_size)
486299720Sarybchik				caddr_t bufferp,
487299720Sarybchik	__in			size_t buffer_size,
488299720Sarybchik	__in			uint32_t offset,
489299720Sarybchik	__out			uint32_t *endp
490299720Sarybchik	);
491299720Sarybchik
492299720Sarybchikextern	__checkReturn	__success(return != B_FALSE)	boolean_t
493299720Sarybchikef10_nvram_buffer_find_item(
494299720Sarybchik	__in_bcount(buffer_size)
495299720Sarybchik				caddr_t bufferp,
496299720Sarybchik	__in			size_t buffer_size,
497299720Sarybchik	__in			uint32_t offset,
498299720Sarybchik	__out			uint32_t *startp,
499299720Sarybchik	__out			uint32_t *lengthp
500299720Sarybchik	);
501299720Sarybchik
502299720Sarybchikextern	__checkReturn		efx_rc_t
503299720Sarybchikef10_nvram_buffer_get_item(
504299720Sarybchik	__in_bcount(buffer_size)
505299720Sarybchik				caddr_t bufferp,
506299720Sarybchik	__in			size_t buffer_size,
507299720Sarybchik	__in			uint32_t offset,
508299720Sarybchik	__in			uint32_t length,
509299720Sarybchik	__out_bcount_part(item_max_size, *lengthp)
510299720Sarybchik				caddr_t itemp,
511299720Sarybchik	__in			size_t item_max_size,
512299720Sarybchik	__out			uint32_t *lengthp
513299720Sarybchik	);
514299720Sarybchik
515299720Sarybchikextern	__checkReturn		efx_rc_t
516299720Sarybchikef10_nvram_buffer_insert_item(
517299720Sarybchik	__in_bcount(buffer_size)
518299720Sarybchik				caddr_t bufferp,
519299720Sarybchik	__in			size_t buffer_size,
520299720Sarybchik	__in			uint32_t offset,
521299720Sarybchik	__in_bcount(length)	caddr_t keyp,
522299720Sarybchik	__in			uint32_t length,
523299720Sarybchik	__out			uint32_t *lengthp
524299720Sarybchik	);
525299720Sarybchik
526299720Sarybchikextern	__checkReturn		efx_rc_t
527299720Sarybchikef10_nvram_buffer_delete_item(
528299720Sarybchik	__in_bcount(buffer_size)
529299720Sarybchik				caddr_t bufferp,
530299720Sarybchik	__in			size_t buffer_size,
531299720Sarybchik	__in			uint32_t offset,
532299720Sarybchik	__in			uint32_t length,
533299720Sarybchik	__in			uint32_t end
534299720Sarybchik	);
535299720Sarybchik
536299720Sarybchikextern	__checkReturn		efx_rc_t
537299720Sarybchikef10_nvram_buffer_finish(
538299720Sarybchik	__in_bcount(buffer_size)
539299720Sarybchik				caddr_t bufferp,
540299720Sarybchik	__in			size_t buffer_size
541299720Sarybchik	);
542299720Sarybchik
543299720Sarybchik#endif	/* EFSYS_OPT_NVRAM */
544299720Sarybchik
545299720Sarybchik
546299720Sarybchik/* PHY */
547299720Sarybchik
548299720Sarybchiktypedef struct ef10_link_state_s {
549299720Sarybchik	uint32_t		els_adv_cap_mask;
550299720Sarybchik	uint32_t		els_lp_cap_mask;
551299720Sarybchik	unsigned int		els_fcntl;
552299720Sarybchik	efx_link_mode_t		els_link_mode;
553299720Sarybchik#if EFSYS_OPT_LOOPBACK
554299720Sarybchik	efx_loopback_type_t	els_loopback;
555299720Sarybchik#endif
556299720Sarybchik	boolean_t		els_mac_up;
557299720Sarybchik} ef10_link_state_t;
558299720Sarybchik
559299720Sarybchikextern			void
560299720Sarybchikef10_phy_link_ev(
561299720Sarybchik	__in		efx_nic_t *enp,
562299720Sarybchik	__in		efx_qword_t *eqp,
563299720Sarybchik	__out		efx_link_mode_t *link_modep);
564299720Sarybchik
565299720Sarybchikextern	__checkReturn	efx_rc_t
566299720Sarybchikef10_phy_get_link(
567299720Sarybchik	__in		efx_nic_t *enp,
568299720Sarybchik	__out		ef10_link_state_t *elsp);
569299720Sarybchik
570299720Sarybchikextern	__checkReturn	efx_rc_t
571299720Sarybchikef10_phy_power(
572299720Sarybchik	__in		efx_nic_t *enp,
573299720Sarybchik	__in		boolean_t on);
574299720Sarybchik
575299720Sarybchikextern	__checkReturn	efx_rc_t
576299720Sarybchikef10_phy_reconfigure(
577299720Sarybchik	__in		efx_nic_t *enp);
578299720Sarybchik
579299720Sarybchikextern	__checkReturn	efx_rc_t
580299720Sarybchikef10_phy_verify(
581299720Sarybchik	__in		efx_nic_t *enp);
582299720Sarybchik
583299720Sarybchikextern	__checkReturn	efx_rc_t
584299720Sarybchikef10_phy_oui_get(
585299720Sarybchik	__in		efx_nic_t *enp,
586299720Sarybchik	__out		uint32_t *ouip);
587299720Sarybchik
588299720Sarybchik#if EFSYS_OPT_PHY_STATS
589299720Sarybchik
590299720Sarybchikextern	__checkReturn			efx_rc_t
591299720Sarybchikef10_phy_stats_update(
592299720Sarybchik	__in				efx_nic_t *enp,
593299720Sarybchik	__in				efsys_mem_t *esmp,
594299720Sarybchik	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
595299720Sarybchik
596299720Sarybchik#endif	/* EFSYS_OPT_PHY_STATS */
597299720Sarybchik
598299720Sarybchik#if EFSYS_OPT_PHY_PROPS
599299720Sarybchik
600299720Sarybchik#if EFSYS_OPT_NAMES
601299720Sarybchik
602299720Sarybchikextern		const char *
603299720Sarybchikef10_phy_prop_name(
604299720Sarybchik	__in	efx_nic_t *enp,
605299720Sarybchik	__in	unsigned int id);
606299720Sarybchik
607299720Sarybchik#endif	/* EFSYS_OPT_NAMES */
608299720Sarybchik
609299720Sarybchikextern	__checkReturn	efx_rc_t
610299720Sarybchikef10_phy_prop_get(
611299720Sarybchik	__in		efx_nic_t *enp,
612299720Sarybchik	__in		unsigned int id,
613299720Sarybchik	__in		uint32_t flags,
614299720Sarybchik	__out		uint32_t *valp);
615299720Sarybchik
616299720Sarybchikextern	__checkReturn	efx_rc_t
617299720Sarybchikef10_phy_prop_set(
618299720Sarybchik	__in		efx_nic_t *enp,
619299720Sarybchik	__in		unsigned int id,
620299720Sarybchik	__in		uint32_t val);
621299720Sarybchik
622299720Sarybchik#endif	/* EFSYS_OPT_PHY_PROPS */
623299720Sarybchik
624299720Sarybchik
625299720Sarybchik/* TX */
626299720Sarybchik
627299720Sarybchikextern	__checkReturn	efx_rc_t
628299720Sarybchikef10_tx_init(
629299720Sarybchik	__in		efx_nic_t *enp);
630299720Sarybchik
631299720Sarybchikextern			void
632299720Sarybchikef10_tx_fini(
633299720Sarybchik	__in		efx_nic_t *enp);
634299720Sarybchik
635299720Sarybchikextern	__checkReturn	efx_rc_t
636299720Sarybchikef10_tx_qcreate(
637299720Sarybchik	__in		efx_nic_t *enp,
638299720Sarybchik	__in		unsigned int index,
639299720Sarybchik	__in		unsigned int label,
640299720Sarybchik	__in		efsys_mem_t *esmp,
641299720Sarybchik	__in		size_t n,
642299720Sarybchik	__in		uint32_t id,
643299720Sarybchik	__in		uint16_t flags,
644299720Sarybchik	__in		efx_evq_t *eep,
645299720Sarybchik	__in		efx_txq_t *etp,
646299720Sarybchik	__out		unsigned int *addedp);
647299720Sarybchik
648299720Sarybchikextern		void
649299720Sarybchikef10_tx_qdestroy(
650299720Sarybchik	__in		efx_txq_t *etp);
651299720Sarybchik
652299720Sarybchikextern	__checkReturn	efx_rc_t
653299720Sarybchikef10_tx_qpost(
654299720Sarybchik	__in		efx_txq_t *etp,
655299720Sarybchik	__in_ecount(n)	efx_buffer_t *eb,
656299720Sarybchik	__in		unsigned int n,
657299720Sarybchik	__in		unsigned int completed,
658299720Sarybchik	__inout		unsigned int *addedp);
659299720Sarybchik
660299720Sarybchikextern			void
661299720Sarybchikef10_tx_qpush(
662299720Sarybchik	__in		efx_txq_t *etp,
663299720Sarybchik	__in		unsigned int added,
664299720Sarybchik	__in		unsigned int pushed);
665299720Sarybchik
666299720Sarybchikextern	__checkReturn	efx_rc_t
667299720Sarybchikef10_tx_qpace(
668299720Sarybchik	__in		efx_txq_t *etp,
669299720Sarybchik	__in		unsigned int ns);
670299720Sarybchik
671299720Sarybchikextern	__checkReturn	efx_rc_t
672299720Sarybchikef10_tx_qflush(
673299720Sarybchik	__in		efx_txq_t *etp);
674299720Sarybchik
675299720Sarybchikextern			void
676299720Sarybchikef10_tx_qenable(
677299720Sarybchik	__in		efx_txq_t *etp);
678299720Sarybchik
679299720Sarybchikextern	__checkReturn	efx_rc_t
680299720Sarybchikef10_tx_qpio_enable(
681299720Sarybchik	__in		efx_txq_t *etp);
682299720Sarybchik
683299720Sarybchikextern			void
684299720Sarybchikef10_tx_qpio_disable(
685299720Sarybchik	__in		efx_txq_t *etp);
686299720Sarybchik
687299720Sarybchikextern	__checkReturn	efx_rc_t
688299720Sarybchikef10_tx_qpio_write(
689299720Sarybchik	__in			efx_txq_t *etp,
690299720Sarybchik	__in_ecount(buf_length)	uint8_t *buffer,
691299720Sarybchik	__in			size_t buf_length,
692299720Sarybchik	__in			size_t pio_buf_offset);
693299720Sarybchik
694299720Sarybchikextern	__checkReturn	efx_rc_t
695299720Sarybchikef10_tx_qpio_post(
696299720Sarybchik	__in			efx_txq_t *etp,
697299720Sarybchik	__in			size_t pkt_length,
698299720Sarybchik	__in			unsigned int completed,
699299720Sarybchik	__inout			unsigned int *addedp);
700299720Sarybchik
701299720Sarybchikextern	__checkReturn	efx_rc_t
702299720Sarybchikef10_tx_qdesc_post(
703299720Sarybchik	__in		efx_txq_t *etp,
704299720Sarybchik	__in_ecount(n)	efx_desc_t *ed,
705299720Sarybchik	__in		unsigned int n,
706299720Sarybchik	__in		unsigned int completed,
707299720Sarybchik	__inout		unsigned int *addedp);
708299720Sarybchik
709299720Sarybchikextern	void
710299720Sarybchikef10_tx_qdesc_dma_create(
711299720Sarybchik	__in	efx_txq_t *etp,
712299720Sarybchik	__in	efsys_dma_addr_t addr,
713299720Sarybchik	__in	size_t size,
714299720Sarybchik	__in	boolean_t eop,
715299720Sarybchik	__out	efx_desc_t *edp);
716299720Sarybchik
717299720Sarybchikextern	void
718299720Sarybchikef10_tx_qdesc_tso_create(
719299720Sarybchik	__in	efx_txq_t *etp,
720299720Sarybchik	__in	uint16_t ipv4_id,
721299720Sarybchik	__in	uint32_t tcp_seq,
722299720Sarybchik	__in	uint8_t	 tcp_flags,
723299720Sarybchik	__out	efx_desc_t *edp);
724299720Sarybchik
725299720Sarybchikextern	void
726299720Sarybchikef10_tx_qdesc_tso2_create(
727299720Sarybchik	__in			efx_txq_t *etp,
728299720Sarybchik	__in			uint16_t ipv4_id,
729299720Sarybchik	__in			uint32_t tcp_seq,
730299720Sarybchik	__in			uint16_t tcp_mss,
731299720Sarybchik	__out_ecount(count)	efx_desc_t *edp,
732299720Sarybchik	__in			int count);
733299720Sarybchik
734299720Sarybchikextern	void
735299720Sarybchikef10_tx_qdesc_vlantci_create(
736299720Sarybchik	__in	efx_txq_t *etp,
737299720Sarybchik	__in	uint16_t vlan_tci,
738299720Sarybchik	__out	efx_desc_t *edp);
739299720Sarybchik
740299720Sarybchik
741299720Sarybchik#if EFSYS_OPT_QSTATS
742299720Sarybchik
743299720Sarybchikextern			void
744299720Sarybchikef10_tx_qstats_update(
745299720Sarybchik	__in				efx_txq_t *etp,
746299720Sarybchik	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
747299720Sarybchik
748299720Sarybchik#endif /* EFSYS_OPT_QSTATS */
749299720Sarybchik
750299720Sarybchiktypedef uint32_t	efx_piobuf_handle_t;
751299720Sarybchik
752299720Sarybchik#define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
753299720Sarybchik
754299720Sarybchikextern	__checkReturn	efx_rc_t
755299720Sarybchikef10_nic_pio_alloc(
756299720Sarybchik	__inout		efx_nic_t *enp,
757299720Sarybchik	__out		uint32_t *bufnump,
758299720Sarybchik	__out		efx_piobuf_handle_t *handlep,
759299720Sarybchik	__out		uint32_t *blknump,
760299720Sarybchik	__out		uint32_t *offsetp,
761299720Sarybchik	__out		size_t *sizep);
762299720Sarybchik
763299720Sarybchikextern	__checkReturn	efx_rc_t
764299720Sarybchikef10_nic_pio_free(
765299720Sarybchik	__inout		efx_nic_t *enp,
766299720Sarybchik	__in		uint32_t bufnum,
767299720Sarybchik	__in		uint32_t blknum);
768299720Sarybchik
769299720Sarybchikextern	__checkReturn	efx_rc_t
770299720Sarybchikef10_nic_pio_link(
771299720Sarybchik	__inout		efx_nic_t *enp,
772299720Sarybchik	__in		uint32_t vi_index,
773299720Sarybchik	__in		efx_piobuf_handle_t handle);
774299720Sarybchik
775299720Sarybchikextern	__checkReturn	efx_rc_t
776299720Sarybchikef10_nic_pio_unlink(
777299720Sarybchik	__inout		efx_nic_t *enp,
778299720Sarybchik	__in		uint32_t vi_index);
779299720Sarybchik
780299720Sarybchik
781299720Sarybchik/* VPD */
782299720Sarybchik
783299720Sarybchik#if EFSYS_OPT_VPD
784299720Sarybchik
785299720Sarybchikextern	__checkReturn		efx_rc_t
786299720Sarybchikef10_vpd_init(
787299720Sarybchik	__in			efx_nic_t *enp);
788299720Sarybchik
789299720Sarybchikextern	__checkReturn		efx_rc_t
790299720Sarybchikef10_vpd_size(
791299720Sarybchik	__in			efx_nic_t *enp,
792299720Sarybchik	__out			size_t *sizep);
793299720Sarybchik
794299720Sarybchikextern	__checkReturn		efx_rc_t
795299720Sarybchikef10_vpd_read(
796299720Sarybchik	__in			efx_nic_t *enp,
797299720Sarybchik	__out_bcount(size)	caddr_t data,
798299720Sarybchik	__in			size_t size);
799299720Sarybchik
800299720Sarybchikextern	__checkReturn		efx_rc_t
801299720Sarybchikef10_vpd_verify(
802299720Sarybchik	__in			efx_nic_t *enp,
803299720Sarybchik	__in_bcount(size)	caddr_t data,
804299720Sarybchik	__in			size_t size);
805299720Sarybchik
806299720Sarybchikextern	__checkReturn		efx_rc_t
807299720Sarybchikef10_vpd_reinit(
808299720Sarybchik	__in			efx_nic_t *enp,
809299720Sarybchik	__in_bcount(size)	caddr_t data,
810299720Sarybchik	__in			size_t size);
811299720Sarybchik
812299720Sarybchikextern	__checkReturn		efx_rc_t
813299720Sarybchikef10_vpd_get(
814299720Sarybchik	__in			efx_nic_t *enp,
815299720Sarybchik	__in_bcount(size)	caddr_t data,
816299720Sarybchik	__in			size_t size,
817299720Sarybchik	__inout			efx_vpd_value_t *evvp);
818299720Sarybchik
819299720Sarybchikextern	__checkReturn		efx_rc_t
820299720Sarybchikef10_vpd_set(
821299720Sarybchik	__in			efx_nic_t *enp,
822299720Sarybchik	__in_bcount(size)	caddr_t data,
823299720Sarybchik	__in			size_t size,
824299720Sarybchik	__in			efx_vpd_value_t *evvp);
825299720Sarybchik
826299720Sarybchikextern	__checkReturn		efx_rc_t
827299720Sarybchikef10_vpd_next(
828299720Sarybchik	__in			efx_nic_t *enp,
829299720Sarybchik	__in_bcount(size)	caddr_t data,
830299720Sarybchik	__in			size_t size,
831299720Sarybchik	__out			efx_vpd_value_t *evvp,
832299720Sarybchik	__inout			unsigned int *contp);
833299720Sarybchik
834299720Sarybchikextern __checkReturn		efx_rc_t
835299720Sarybchikef10_vpd_write(
836299720Sarybchik	__in			efx_nic_t *enp,
837299720Sarybchik	__in_bcount(size)	caddr_t data,
838299720Sarybchik	__in			size_t size);
839299720Sarybchik
840299720Sarybchikextern				void
841299720Sarybchikef10_vpd_fini(
842299720Sarybchik	__in			efx_nic_t *enp);
843299720Sarybchik
844299720Sarybchik#endif	/* EFSYS_OPT_VPD */
845299720Sarybchik
846299720Sarybchik
847299720Sarybchik/* RX */
848299720Sarybchik
849299720Sarybchikextern	__checkReturn	efx_rc_t
850299720Sarybchikef10_rx_init(
851299720Sarybchik	__in		efx_nic_t *enp);
852299720Sarybchik
853299720Sarybchik#if EFSYS_OPT_RX_SCATTER
854299720Sarybchikextern	__checkReturn	efx_rc_t
855299720Sarybchikef10_rx_scatter_enable(
856299720Sarybchik	__in		efx_nic_t *enp,
857299720Sarybchik	__in		unsigned int buf_size);
858299720Sarybchik#endif	/* EFSYS_OPT_RX_SCATTER */
859299720Sarybchik
860299720Sarybchik
861299720Sarybchik#if EFSYS_OPT_RX_SCALE
862299720Sarybchik
863299720Sarybchikextern	__checkReturn	efx_rc_t
864299720Sarybchikef10_rx_scale_mode_set(
865299720Sarybchik	__in		efx_nic_t *enp,
866299720Sarybchik	__in		efx_rx_hash_alg_t alg,
867299720Sarybchik	__in		efx_rx_hash_type_t type,
868299720Sarybchik	__in		boolean_t insert);
869299720Sarybchik
870299720Sarybchikextern	__checkReturn	efx_rc_t
871299720Sarybchikef10_rx_scale_key_set(
872299720Sarybchik	__in		efx_nic_t *enp,
873299720Sarybchik	__in_ecount(n)	uint8_t *key,
874299720Sarybchik	__in		size_t n);
875299720Sarybchik
876299720Sarybchikextern	__checkReturn	efx_rc_t
877299720Sarybchikef10_rx_scale_tbl_set(
878299720Sarybchik	__in		efx_nic_t *enp,
879299720Sarybchik	__in_ecount(n)	unsigned int *table,
880299720Sarybchik	__in		size_t n);
881299720Sarybchik
882299720Sarybchikextern	__checkReturn	uint32_t
883299720Sarybchikef10_rx_prefix_hash(
884299720Sarybchik	__in		efx_nic_t *enp,
885299720Sarybchik	__in		efx_rx_hash_alg_t func,
886299720Sarybchik	__in		uint8_t *buffer);
887299720Sarybchik
888299720Sarybchik#endif /* EFSYS_OPT_RX_SCALE */
889299720Sarybchik
890299720Sarybchikextern	__checkReturn	efx_rc_t
891299720Sarybchikef10_rx_prefix_pktlen(
892299720Sarybchik	__in		efx_nic_t *enp,
893299720Sarybchik	__in		uint8_t *buffer,
894299720Sarybchik	__out		uint16_t *lengthp);
895299720Sarybchik
896299720Sarybchikextern			void
897299720Sarybchikef10_rx_qpost(
898299720Sarybchik	__in		efx_rxq_t *erp,
899299720Sarybchik	__in_ecount(n)	efsys_dma_addr_t *addrp,
900299720Sarybchik	__in		size_t size,
901299720Sarybchik	__in		unsigned int n,
902299720Sarybchik	__in		unsigned int completed,
903299720Sarybchik	__in		unsigned int added);
904299720Sarybchik
905299720Sarybchikextern			void
906299720Sarybchikef10_rx_qpush(
907299720Sarybchik	__in		efx_rxq_t *erp,
908299720Sarybchik	__in		unsigned int added,
909299720Sarybchik	__inout		unsigned int *pushedp);
910299720Sarybchik
911299720Sarybchikextern	__checkReturn	efx_rc_t
912299720Sarybchikef10_rx_qflush(
913299720Sarybchik	__in		efx_rxq_t *erp);
914299720Sarybchik
915299720Sarybchikextern		void
916299720Sarybchikef10_rx_qenable(
917299720Sarybchik	__in		efx_rxq_t *erp);
918299720Sarybchik
919299720Sarybchikextern	__checkReturn	efx_rc_t
920299720Sarybchikef10_rx_qcreate(
921299720Sarybchik	__in		efx_nic_t *enp,
922299720Sarybchik	__in		unsigned int index,
923299720Sarybchik	__in		unsigned int label,
924299720Sarybchik	__in		efx_rxq_type_t type,
925299720Sarybchik	__in		efsys_mem_t *esmp,
926299720Sarybchik	__in		size_t n,
927299720Sarybchik	__in		uint32_t id,
928299720Sarybchik	__in		efx_evq_t *eep,
929299720Sarybchik	__in		efx_rxq_t *erp);
930299720Sarybchik
931299720Sarybchikextern			void
932299720Sarybchikef10_rx_qdestroy(
933299720Sarybchik	__in		efx_rxq_t *erp);
934299720Sarybchik
935299720Sarybchikextern			void
936299720Sarybchikef10_rx_fini(
937299720Sarybchik	__in		efx_nic_t *enp);
938299720Sarybchik
939299720Sarybchik#if EFSYS_OPT_FILTER
940299720Sarybchik
941299720Sarybchiktypedef struct ef10_filter_handle_s {
942299720Sarybchik	uint32_t	efh_lo;
943299720Sarybchik	uint32_t	efh_hi;
944299720Sarybchik} ef10_filter_handle_t;
945299720Sarybchik
946299720Sarybchiktypedef struct ef10_filter_entry_s {
947299720Sarybchik	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
948299720Sarybchik	ef10_filter_handle_t efe_handle;
949299720Sarybchik} ef10_filter_entry_t;
950299720Sarybchik
951299720Sarybchik/*
952299720Sarybchik * BUSY flag indicates that an update is in progress.
953299720Sarybchik * AUTO_OLD flag is used to mark and sweep MAC packet filters.
954299720Sarybchik */
955299720Sarybchik#define	EFX_EF10_FILTER_FLAG_BUSY	1U
956299720Sarybchik#define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
957299720Sarybchik#define	EFX_EF10_FILTER_FLAGS		3U
958299720Sarybchik
959299720Sarybchik/*
960299720Sarybchik * Size of the hash table used by the driver. Doesn't need to be the
961299720Sarybchik * same size as the hardware's table.
962299720Sarybchik */
963299720Sarybchik#define	EFX_EF10_FILTER_TBL_ROWS 8192
964299720Sarybchik
965299720Sarybchik/* Only need to allow for one directed and one unknown unicast filter */
966299720Sarybchik#define	EFX_EF10_FILTER_UNICAST_FILTERS_MAX	2
967299720Sarybchik
968299720Sarybchik/* Allow for the broadcast address to be added to the multicast list */
969299720Sarybchik#define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
970299720Sarybchik
971299720Sarybchiktypedef struct ef10_filter_table_s {
972299720Sarybchik	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
973299720Sarybchik	efx_rxq_t *		eft_default_rxq;
974299720Sarybchik	boolean_t		eft_using_rss;
975299720Sarybchik	uint32_t		eft_unicst_filter_indexes[
976299720Sarybchik	    EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
977299720Sarybchik	boolean_t		eft_unicst_filter_count;
978299720Sarybchik	uint32_t		eft_mulcst_filter_indexes[
979299720Sarybchik	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
980299720Sarybchik	uint32_t		eft_mulcst_filter_count;
981299720Sarybchik	boolean_t		eft_using_all_mulcst;
982299720Sarybchik} ef10_filter_table_t;
983299720Sarybchik
984299720Sarybchik	__checkReturn	efx_rc_t
985299720Sarybchikef10_filter_init(
986299720Sarybchik	__in		efx_nic_t *enp);
987299720Sarybchik
988299720Sarybchik			void
989299720Sarybchikef10_filter_fini(
990299720Sarybchik	__in		efx_nic_t *enp);
991299720Sarybchik
992299720Sarybchik	__checkReturn	efx_rc_t
993299720Sarybchikef10_filter_restore(
994299720Sarybchik	__in		efx_nic_t *enp);
995299720Sarybchik
996299720Sarybchik	__checkReturn	efx_rc_t
997299720Sarybchikef10_filter_add(
998299720Sarybchik	__in		efx_nic_t *enp,
999299720Sarybchik	__inout		efx_filter_spec_t *spec,
1000299720Sarybchik	__in		boolean_t may_replace);
1001299720Sarybchik
1002299720Sarybchik	__checkReturn	efx_rc_t
1003299720Sarybchikef10_filter_delete(
1004299720Sarybchik	__in		efx_nic_t *enp,
1005299720Sarybchik	__inout		efx_filter_spec_t *spec);
1006299720Sarybchik
1007299720Sarybchikextern	__checkReturn	efx_rc_t
1008299720Sarybchikef10_filter_supported_filters(
1009299720Sarybchik	__in		efx_nic_t *enp,
1010299720Sarybchik	__out		uint32_t *list,
1011299720Sarybchik	__out		size_t *length);
1012299720Sarybchik
1013299720Sarybchikextern	__checkReturn	efx_rc_t
1014299720Sarybchikef10_filter_reconfigure(
1015299720Sarybchik	__in				efx_nic_t *enp,
1016299720Sarybchik	__in_ecount(6)			uint8_t const *mac_addr,
1017299720Sarybchik	__in				boolean_t all_unicst,
1018299720Sarybchik	__in				boolean_t mulcst,
1019299720Sarybchik	__in				boolean_t all_mulcst,
1020299720Sarybchik	__in				boolean_t brdcst,
1021299720Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
1022299720Sarybchik	__in				uint32_t count);
1023299720Sarybchik
1024299720Sarybchikextern		void
1025299720Sarybchikef10_filter_get_default_rxq(
1026299720Sarybchik	__in		efx_nic_t *enp,
1027299720Sarybchik	__out		efx_rxq_t **erpp,
1028299720Sarybchik	__out		boolean_t *using_rss);
1029299720Sarybchik
1030299720Sarybchikextern		void
1031299720Sarybchikef10_filter_default_rxq_set(
1032299720Sarybchik	__in		efx_nic_t *enp,
1033299720Sarybchik	__in		efx_rxq_t *erp,
1034299720Sarybchik	__in		boolean_t using_rss);
1035299720Sarybchik
1036299720Sarybchikextern		void
1037299720Sarybchikef10_filter_default_rxq_clear(
1038299720Sarybchik	__in		efx_nic_t *enp);
1039299720Sarybchik
1040299720Sarybchik
1041299720Sarybchik#endif /* EFSYS_OPT_FILTER */
1042299720Sarybchik
1043299720Sarybchikextern	__checkReturn			efx_rc_t
1044299720Sarybchikefx_mcdi_get_function_info(
1045299720Sarybchik	__in				efx_nic_t *enp,
1046299720Sarybchik	__out				uint32_t *pfp,
1047299720Sarybchik	__out_opt			uint32_t *vfp);
1048299720Sarybchik
1049299720Sarybchikextern	__checkReturn		efx_rc_t
1050299720Sarybchikefx_mcdi_privilege_mask(
1051299720Sarybchik	__in			efx_nic_t *enp,
1052299720Sarybchik	__in			uint32_t pf,
1053299720Sarybchik	__in			uint32_t vf,
1054299720Sarybchik	__out			uint32_t *maskp);
1055299720Sarybchik
1056299720Sarybchikextern	__checkReturn	efx_rc_t
1057293887Sarybchikefx_mcdi_get_port_assignment(
1058293887Sarybchik	__in		efx_nic_t *enp,
1059293887Sarybchik	__out		uint32_t *portp);
1060293734Sarybchik
1061293887Sarybchikextern	__checkReturn	efx_rc_t
1062293887Sarybchikefx_mcdi_get_port_modes(
1063293887Sarybchik	__in		efx_nic_t *enp,
1064293887Sarybchik	__out		uint32_t *modesp);
1065293734Sarybchik
1066293887Sarybchikextern	__checkReturn	efx_rc_t
1067293887Sarybchikefx_mcdi_get_mac_address_pf(
1068293887Sarybchik	__in			efx_nic_t *enp,
1069293887Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1070293887Sarybchik
1071293887Sarybchikextern	__checkReturn	efx_rc_t
1072293887Sarybchikefx_mcdi_get_mac_address_vf(
1073293887Sarybchik	__in			efx_nic_t *enp,
1074293887Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1075293887Sarybchik
1076293887Sarybchikextern	__checkReturn	efx_rc_t
1077293887Sarybchikefx_mcdi_get_clock(
1078293887Sarybchik	__in		efx_nic_t *enp,
1079293887Sarybchik	__out		uint32_t *sys_freqp);
1080293887Sarybchik
1081293887Sarybchikextern	__checkReturn	efx_rc_t
1082293887Sarybchikefx_mcdi_get_vector_cfg(
1083293887Sarybchik	__in		efx_nic_t *enp,
1084293887Sarybchik	__out_opt	uint32_t *vec_basep,
1085293887Sarybchik	__out_opt	uint32_t *pf_nvecp,
1086293887Sarybchik	__out_opt	uint32_t *vf_nvecp);
1087293887Sarybchik
1088293887Sarybchikextern	__checkReturn	efx_rc_t
1089293887Sarybchikef10_get_datapath_caps(
1090293887Sarybchik	__in		efx_nic_t *enp);
1091293887Sarybchik
1092294079Sarybchikextern	__checkReturn		efx_rc_t
1093294079Sarybchikef10_get_privilege_mask(
1094294079Sarybchik	__in			efx_nic_t *enp,
1095294079Sarybchik	__out			uint32_t *maskp);
1096294079Sarybchik
1097293887Sarybchikextern	__checkReturn	efx_rc_t
1098293887Sarybchikef10_external_port_mapping(
1099293887Sarybchik	__in		efx_nic_t *enp,
1100293887Sarybchik	__in		uint32_t port,
1101293887Sarybchik	__out		uint8_t *external_portp);
1102293887Sarybchik
1103293887Sarybchik
1104293734Sarybchik#ifdef	__cplusplus
1105293734Sarybchik}
1106293734Sarybchik#endif
1107293734Sarybchik
1108293734Sarybchik#endif	/* _SYS_EF10_IMPL_H */
1109