1293734Sarybchik/*-
2301388Sarybchik * Copyright (c) 2015-2016 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: stable/10/sys/dev/sfxge/common/ef10_impl.h 342512 2018-12-26 10:21:40Z arybchik $
31293734Sarybchik */
32293734Sarybchik
33293734Sarybchik#ifndef	_SYS_EF10_IMPL_H
34293734Sarybchik#define	_SYS_EF10_IMPL_H
35293734Sarybchik
36293734Sarybchik#ifdef	__cplusplus
37293734Sarybchikextern "C" {
38293734Sarybchik#endif
39293734Sarybchik
40293982Sarybchik#if (EFSYS_OPT_HUNTINGTON && EFSYS_OPT_MEDFORD)
41293982Sarybchik#define	EF10_MAX_PIOBUF_NBUFS	MAX(HUNT_PIOBUF_NBUFS, MEDFORD_PIOBUF_NBUFS)
42293982Sarybchik#elif EFSYS_OPT_HUNTINGTON
43293982Sarybchik#define	EF10_MAX_PIOBUF_NBUFS	HUNT_PIOBUF_NBUFS
44293982Sarybchik#elif EFSYS_OPT_MEDFORD
45293982Sarybchik#define	EF10_MAX_PIOBUF_NBUFS	MEDFORD_PIOBUF_NBUFS
46293982Sarybchik#endif
47293734Sarybchik
48301348Sarybchik/*
49301348Sarybchik * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could
50301348Sarybchik * possibly be increased, or the write size reported by newer firmware used
51301348Sarybchik * instead.
52301348Sarybchik */
53301348Sarybchik#define	EF10_NVRAM_CHUNK 0x80
54301348Sarybchik
55301348Sarybchik/* Alignment requirement for value written to RX WPTR:
56301348Sarybchik *  the WPTR must be aligned to an 8 descriptor boundary
57301348Sarybchik */
58301348Sarybchik#define	EF10_RX_WPTR_ALIGN 8
59301348Sarybchik
60301348Sarybchik/*
61301348Sarybchik * Max byte offset into the packet the TCP header must start for the hardware
62301348Sarybchik * to be able to parse the packet correctly.
63301348Sarybchik */
64301348Sarybchik#define	EF10_TCP_HEADER_OFFSET_LIMIT	208
65301348Sarybchik
66301348Sarybchik/* Invalid RSS context handle */
67301348Sarybchik#define	EF10_RSS_CONTEXT_INVALID	(0xffffffff)
68301348Sarybchik
69301348Sarybchik
70301348Sarybchik/* EV */
71301348Sarybchik
72301348Sarybchik	__checkReturn	efx_rc_t
73301348Sarybchikef10_ev_init(
74301348Sarybchik	__in		efx_nic_t *enp);
75301348Sarybchik
76301348Sarybchik			void
77301348Sarybchikef10_ev_fini(
78301348Sarybchik	__in		efx_nic_t *enp);
79301348Sarybchik
80301348Sarybchik	__checkReturn	efx_rc_t
81301348Sarybchikef10_ev_qcreate(
82301348Sarybchik	__in		efx_nic_t *enp,
83301348Sarybchik	__in		unsigned int index,
84301348Sarybchik	__in		efsys_mem_t *esmp,
85301348Sarybchik	__in		size_t n,
86301348Sarybchik	__in		uint32_t id,
87301980Sarybchik	__in		uint32_t us,
88311070Sarybchik	__in		uint32_t flags,
89301348Sarybchik	__in		efx_evq_t *eep);
90301348Sarybchik
91301348Sarybchik			void
92301348Sarybchikef10_ev_qdestroy(
93301348Sarybchik	__in		efx_evq_t *eep);
94301348Sarybchik
95301348Sarybchik	__checkReturn	efx_rc_t
96301348Sarybchikef10_ev_qprime(
97301348Sarybchik	__in		efx_evq_t *eep,
98301348Sarybchik	__in		unsigned int count);
99301348Sarybchik
100301348Sarybchik			void
101301348Sarybchikef10_ev_qpost(
102301348Sarybchik	__in	efx_evq_t *eep,
103301348Sarybchik	__in	uint16_t data);
104301348Sarybchik
105301348Sarybchik	__checkReturn	efx_rc_t
106301348Sarybchikef10_ev_qmoderate(
107301348Sarybchik	__in		efx_evq_t *eep,
108301348Sarybchik	__in		unsigned int us);
109301348Sarybchik
110301348Sarybchik#if EFSYS_OPT_QSTATS
111301348Sarybchik			void
112301348Sarybchikef10_ev_qstats_update(
113301348Sarybchik	__in				efx_evq_t *eep,
114301348Sarybchik	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
115301348Sarybchik#endif /* EFSYS_OPT_QSTATS */
116301348Sarybchik
117301348Sarybchik		void
118301348Sarybchikef10_ev_rxlabel_init(
119301348Sarybchik	__in		efx_evq_t *eep,
120301348Sarybchik	__in		efx_rxq_t *erp,
121301348Sarybchik	__in		unsigned int label);
122301348Sarybchik
123301348Sarybchik		void
124301348Sarybchikef10_ev_rxlabel_fini(
125301348Sarybchik	__in		efx_evq_t *eep,
126301348Sarybchik	__in		unsigned int label);
127301348Sarybchik
128301348Sarybchik/* INTR */
129301348Sarybchik
130301348Sarybchik	__checkReturn	efx_rc_t
131301348Sarybchikef10_intr_init(
132301348Sarybchik	__in		efx_nic_t *enp,
133301348Sarybchik	__in		efx_intr_type_t type,
134301348Sarybchik	__in		efsys_mem_t *esmp);
135301348Sarybchik
136301348Sarybchik			void
137301348Sarybchikef10_intr_enable(
138301348Sarybchik	__in		efx_nic_t *enp);
139301348Sarybchik
140301348Sarybchik			void
141301348Sarybchikef10_intr_disable(
142301348Sarybchik	__in		efx_nic_t *enp);
143301348Sarybchik
144301348Sarybchik			void
145301348Sarybchikef10_intr_disable_unlocked(
146301348Sarybchik	__in		efx_nic_t *enp);
147301348Sarybchik
148301348Sarybchik	__checkReturn	efx_rc_t
149301348Sarybchikef10_intr_trigger(
150301348Sarybchik	__in		efx_nic_t *enp,
151301348Sarybchik	__in		unsigned int level);
152301348Sarybchik
153301348Sarybchik			void
154301348Sarybchikef10_intr_status_line(
155301348Sarybchik	__in		efx_nic_t *enp,
156301348Sarybchik	__out		boolean_t *fatalp,
157301348Sarybchik	__out		uint32_t *qmaskp);
158301348Sarybchik
159301348Sarybchik			void
160301348Sarybchikef10_intr_status_message(
161301348Sarybchik	__in		efx_nic_t *enp,
162301348Sarybchik	__in		unsigned int message,
163301348Sarybchik	__out		boolean_t *fatalp);
164301348Sarybchik
165301348Sarybchik			void
166301348Sarybchikef10_intr_fatal(
167301348Sarybchik	__in		efx_nic_t *enp);
168301348Sarybchik			void
169301348Sarybchikef10_intr_fini(
170301348Sarybchik	__in		efx_nic_t *enp);
171301348Sarybchik
172301348Sarybchik/* NIC */
173301348Sarybchik
174294377Sarybchikextern	__checkReturn	efx_rc_t
175301348Sarybchikef10_nic_probe(
176301348Sarybchik	__in		efx_nic_t *enp);
177301348Sarybchik
178301348Sarybchikextern	__checkReturn	efx_rc_t
179301348Sarybchikef10_nic_set_drv_limits(
180301348Sarybchik	__inout		efx_nic_t *enp,
181301348Sarybchik	__in		efx_drv_limits_t *edlp);
182301348Sarybchik
183301348Sarybchikextern	__checkReturn	efx_rc_t
184301348Sarybchikef10_nic_get_vi_pool(
185301348Sarybchik	__in		efx_nic_t *enp,
186301348Sarybchik	__out		uint32_t *vi_countp);
187301348Sarybchik
188301348Sarybchikextern	__checkReturn	efx_rc_t
189301348Sarybchikef10_nic_get_bar_region(
190301348Sarybchik	__in		efx_nic_t *enp,
191301348Sarybchik	__in		efx_nic_region_t region,
192301348Sarybchik	__out		uint32_t *offsetp,
193301348Sarybchik	__out		size_t *sizep);
194301348Sarybchik
195301348Sarybchikextern	__checkReturn	efx_rc_t
196301348Sarybchikef10_nic_reset(
197301348Sarybchik	__in		efx_nic_t *enp);
198301348Sarybchik
199301348Sarybchikextern	__checkReturn	efx_rc_t
200301348Sarybchikef10_nic_init(
201301348Sarybchik	__in		efx_nic_t *enp);
202301348Sarybchik
203301348Sarybchik#if EFSYS_OPT_DIAG
204301348Sarybchik
205301348Sarybchikextern	__checkReturn	efx_rc_t
206301348Sarybchikef10_nic_register_test(
207301348Sarybchik	__in		efx_nic_t *enp);
208301348Sarybchik
209301348Sarybchik#endif	/* EFSYS_OPT_DIAG */
210301348Sarybchik
211301348Sarybchikextern			void
212301348Sarybchikef10_nic_fini(
213301348Sarybchik	__in		efx_nic_t *enp);
214301348Sarybchik
215301348Sarybchikextern			void
216301348Sarybchikef10_nic_unprobe(
217301348Sarybchik	__in		efx_nic_t *enp);
218301348Sarybchik
219301348Sarybchik
220301348Sarybchik/* MAC */
221301348Sarybchik
222301348Sarybchikextern	__checkReturn	efx_rc_t
223301348Sarybchikef10_mac_poll(
224301348Sarybchik	__in		efx_nic_t *enp,
225301348Sarybchik	__out		efx_link_mode_t *link_modep);
226301348Sarybchik
227301348Sarybchikextern	__checkReturn	efx_rc_t
228301348Sarybchikef10_mac_up(
229301348Sarybchik	__in		efx_nic_t *enp,
230301348Sarybchik	__out		boolean_t *mac_upp);
231301348Sarybchik
232301348Sarybchikextern	__checkReturn	efx_rc_t
233301348Sarybchikef10_mac_addr_set(
234301348Sarybchik	__in	efx_nic_t *enp);
235301348Sarybchik
236301348Sarybchikextern	__checkReturn	efx_rc_t
237301348Sarybchikef10_mac_pdu_set(
238301348Sarybchik	__in	efx_nic_t *enp);
239301348Sarybchik
240301348Sarybchikextern	__checkReturn	efx_rc_t
241301380Sarybchikef10_mac_pdu_get(
242301380Sarybchik	__in	efx_nic_t *enp,
243301380Sarybchik	__out	size_t *pdu);
244301380Sarybchik
245301380Sarybchikextern	__checkReturn	efx_rc_t
246301348Sarybchikef10_mac_reconfigure(
247301348Sarybchik	__in	efx_nic_t *enp);
248301348Sarybchik
249301348Sarybchikextern	__checkReturn	efx_rc_t
250301348Sarybchikef10_mac_multicast_list_set(
251301348Sarybchik	__in				efx_nic_t *enp);
252301348Sarybchik
253301348Sarybchikextern	__checkReturn	efx_rc_t
254301348Sarybchikef10_mac_filter_default_rxq_set(
255301348Sarybchik	__in		efx_nic_t *enp,
256301348Sarybchik	__in		efx_rxq_t *erp,
257301348Sarybchik	__in		boolean_t using_rss);
258301348Sarybchik
259301348Sarybchikextern			void
260301348Sarybchikef10_mac_filter_default_rxq_clear(
261301348Sarybchik	__in		efx_nic_t *enp);
262301348Sarybchik
263301348Sarybchik#if EFSYS_OPT_LOOPBACK
264301348Sarybchik
265301348Sarybchikextern	__checkReturn	efx_rc_t
266301348Sarybchikef10_mac_loopback_set(
267301348Sarybchik	__in		efx_nic_t *enp,
268301348Sarybchik	__in		efx_link_mode_t link_mode,
269301348Sarybchik	__in		efx_loopback_type_t loopback_type);
270301348Sarybchik
271301348Sarybchik#endif	/* EFSYS_OPT_LOOPBACK */
272301348Sarybchik
273301348Sarybchik#if EFSYS_OPT_MAC_STATS
274301348Sarybchik
275301348Sarybchikextern	__checkReturn			efx_rc_t
276311080Sarybchikef10_mac_stats_get_mask(
277311080Sarybchik	__in				efx_nic_t *enp,
278311080Sarybchik	__inout_bcount(mask_size)	uint32_t *maskp,
279311080Sarybchik	__in				size_t mask_size);
280311080Sarybchik
281311080Sarybchikextern	__checkReturn			efx_rc_t
282301348Sarybchikef10_mac_stats_update(
283301348Sarybchik	__in				efx_nic_t *enp,
284301348Sarybchik	__in				efsys_mem_t *esmp,
285301348Sarybchik	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
286301348Sarybchik	__inout_opt			uint32_t *generationp);
287301348Sarybchik
288301348Sarybchik#endif	/* EFSYS_OPT_MAC_STATS */
289301348Sarybchik
290301348Sarybchik
291301348Sarybchik/* MCDI */
292301348Sarybchik
293301348Sarybchik#if EFSYS_OPT_MCDI
294301348Sarybchik
295301348Sarybchikextern	__checkReturn	efx_rc_t
296301348Sarybchikef10_mcdi_init(
297301348Sarybchik	__in		efx_nic_t *enp,
298301348Sarybchik	__in		const efx_mcdi_transport_t *mtp);
299301348Sarybchik
300301348Sarybchikextern			void
301301348Sarybchikef10_mcdi_fini(
302301348Sarybchik	__in		efx_nic_t *enp);
303301348Sarybchik
304301348Sarybchikextern			void
305301348Sarybchikef10_mcdi_send_request(
306311065Sarybchik	__in			efx_nic_t *enp,
307311065Sarybchik	__in_bcount(hdr_len)	void *hdrp,
308311065Sarybchik	__in			size_t hdr_len,
309311065Sarybchik	__in_bcount(sdu_len)	void *sdup,
310311065Sarybchik	__in			size_t sdu_len);
311301348Sarybchik
312301348Sarybchikextern	__checkReturn	boolean_t
313301348Sarybchikef10_mcdi_poll_response(
314301348Sarybchik	__in		efx_nic_t *enp);
315301348Sarybchik
316301348Sarybchikextern			void
317301348Sarybchikef10_mcdi_read_response(
318301348Sarybchik	__in			efx_nic_t *enp,
319301348Sarybchik	__out_bcount(length)	void *bufferp,
320301348Sarybchik	__in			size_t offset,
321301348Sarybchik	__in			size_t length);
322301348Sarybchik
323301348Sarybchikextern			efx_rc_t
324301348Sarybchikef10_mcdi_poll_reboot(
325301348Sarybchik	__in		efx_nic_t *enp);
326301348Sarybchik
327301348Sarybchikextern	__checkReturn	efx_rc_t
328301348Sarybchikef10_mcdi_feature_supported(
329301348Sarybchik	__in		efx_nic_t *enp,
330301348Sarybchik	__in		efx_mcdi_feature_id_t id,
331301348Sarybchik	__out		boolean_t *supportedp);
332301348Sarybchik
333311496Sarybchikextern			void
334311496Sarybchikef10_mcdi_get_timeout(
335311496Sarybchik	__in		efx_nic_t *enp,
336311496Sarybchik	__in		efx_mcdi_req_t *emrp,
337311496Sarybchik	__out		uint32_t *timeoutp);
338311496Sarybchik
339301348Sarybchik#endif /* EFSYS_OPT_MCDI */
340301348Sarybchik
341301348Sarybchik/* NVRAM */
342301348Sarybchik
343301348Sarybchik#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
344301348Sarybchik
345301348Sarybchikextern	__checkReturn		efx_rc_t
346301348Sarybchikef10_nvram_buf_read_tlv(
347301348Sarybchik	__in				efx_nic_t *enp,
348301348Sarybchik	__in_bcount(max_seg_size)	caddr_t seg_data,
349301348Sarybchik	__in				size_t max_seg_size,
350301348Sarybchik	__in				uint32_t tag,
351301348Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
352301348Sarybchik	__out				size_t *sizep);
353301348Sarybchik
354301348Sarybchikextern	__checkReturn		efx_rc_t
355301348Sarybchikef10_nvram_buf_write_tlv(
356301348Sarybchik	__inout_bcount(partn_size)	caddr_t partn_data,
357301348Sarybchik	__in				size_t partn_size,
358301348Sarybchik	__in				uint32_t tag,
359301348Sarybchik	__in_bcount(tag_size)		caddr_t tag_data,
360301348Sarybchik	__in				size_t tag_size,
361301348Sarybchik	__out				size_t *total_lengthp);
362301348Sarybchik
363301348Sarybchikextern	__checkReturn		efx_rc_t
364301348Sarybchikef10_nvram_partn_read_tlv(
365301348Sarybchik	__in				efx_nic_t *enp,
366301348Sarybchik	__in				uint32_t partn,
367301348Sarybchik	__in				uint32_t tag,
368301348Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
369301348Sarybchik	__out				size_t *sizep);
370301348Sarybchik
371301348Sarybchikextern	__checkReturn		efx_rc_t
372301348Sarybchikef10_nvram_partn_write_tlv(
373301348Sarybchik	__in			efx_nic_t *enp,
374301348Sarybchik	__in			uint32_t partn,
375301348Sarybchik	__in			uint32_t tag,
376301348Sarybchik	__in_bcount(size)	caddr_t data,
377301348Sarybchik	__in			size_t size);
378301348Sarybchik
379301348Sarybchikextern	__checkReturn		efx_rc_t
380301348Sarybchikef10_nvram_partn_write_segment_tlv(
381301348Sarybchik	__in			efx_nic_t *enp,
382301348Sarybchik	__in			uint32_t partn,
383301348Sarybchik	__in			uint32_t tag,
384301348Sarybchik	__in_bcount(size)	caddr_t data,
385301348Sarybchik	__in			size_t size,
386301348Sarybchik	__in			boolean_t all_segments);
387301348Sarybchik
388301348Sarybchikextern	__checkReturn		efx_rc_t
389301348Sarybchikef10_nvram_partn_lock(
390301348Sarybchik	__in			efx_nic_t *enp,
391301348Sarybchik	__in			uint32_t partn);
392301348Sarybchik
393311495Sarybchikextern	__checkReturn		efx_rc_t
394301348Sarybchikef10_nvram_partn_unlock(
395301348Sarybchik	__in			efx_nic_t *enp,
396311498Sarybchik	__in			uint32_t partn,
397311498Sarybchik	__out_opt		uint32_t *resultp);
398301348Sarybchik
399301348Sarybchik#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
400301348Sarybchik
401301348Sarybchik#if EFSYS_OPT_NVRAM
402301348Sarybchik
403301348Sarybchik#if EFSYS_OPT_DIAG
404301348Sarybchik
405301348Sarybchikextern	__checkReturn		efx_rc_t
406301348Sarybchikef10_nvram_test(
407301348Sarybchik	__in			efx_nic_t *enp);
408301348Sarybchik
409301348Sarybchik#endif	/* EFSYS_OPT_DIAG */
410301348Sarybchik
411301348Sarybchikextern	__checkReturn		efx_rc_t
412301348Sarybchikef10_nvram_type_to_partn(
413301348Sarybchik	__in			efx_nic_t *enp,
414301348Sarybchik	__in			efx_nvram_type_t type,
415301348Sarybchik	__out			uint32_t *partnp);
416301348Sarybchik
417301348Sarybchikextern	__checkReturn		efx_rc_t
418301348Sarybchikef10_nvram_partn_size(
419301348Sarybchik	__in			efx_nic_t *enp,
420301348Sarybchik	__in			uint32_t partn,
421301348Sarybchik	__out			size_t *sizep);
422301348Sarybchik
423301348Sarybchikextern	__checkReturn		efx_rc_t
424301348Sarybchikef10_nvram_partn_rw_start(
425301348Sarybchik	__in			efx_nic_t *enp,
426301348Sarybchik	__in			uint32_t partn,
427301348Sarybchik	__out			size_t *chunk_sizep);
428301348Sarybchik
429301348Sarybchikextern	__checkReturn		efx_rc_t
430301348Sarybchikef10_nvram_partn_read_mode(
431301348Sarybchik	__in			efx_nic_t *enp,
432301348Sarybchik	__in			uint32_t partn,
433301348Sarybchik	__in			unsigned int offset,
434301348Sarybchik	__out_bcount(size)	caddr_t data,
435301348Sarybchik	__in			size_t size,
436301348Sarybchik	__in			uint32_t mode);
437301348Sarybchik
438301348Sarybchikextern	__checkReturn		efx_rc_t
439301348Sarybchikef10_nvram_partn_read(
440301348Sarybchik	__in			efx_nic_t *enp,
441301348Sarybchik	__in			uint32_t partn,
442301348Sarybchik	__in			unsigned int offset,
443342512Sarybchik	__in_bcount(size)	caddr_t data,
444301348Sarybchik	__in			size_t size);
445301348Sarybchik
446301348Sarybchikextern	__checkReturn		efx_rc_t
447301348Sarybchikef10_nvram_partn_erase(
448301348Sarybchik	__in			efx_nic_t *enp,
449301348Sarybchik	__in			uint32_t partn,
450301348Sarybchik	__in			unsigned int offset,
451301348Sarybchik	__in			size_t size);
452301348Sarybchik
453301348Sarybchikextern	__checkReturn		efx_rc_t
454301348Sarybchikef10_nvram_partn_write(
455301348Sarybchik	__in			efx_nic_t *enp,
456301348Sarybchik	__in			uint32_t partn,
457301348Sarybchik	__in			unsigned int offset,
458301348Sarybchik	__out_bcount(size)	caddr_t data,
459301348Sarybchik	__in			size_t size);
460301348Sarybchik
461311495Sarybchikextern	__checkReturn		efx_rc_t
462301348Sarybchikef10_nvram_partn_rw_finish(
463301348Sarybchik	__in			efx_nic_t *enp,
464301348Sarybchik	__in			uint32_t partn);
465301348Sarybchik
466301348Sarybchikextern	__checkReturn		efx_rc_t
467301348Sarybchikef10_nvram_partn_get_version(
468301348Sarybchik	__in			efx_nic_t *enp,
469301348Sarybchik	__in			uint32_t partn,
470301348Sarybchik	__out			uint32_t *subtypep,
471301348Sarybchik	__out_ecount(4)		uint16_t version[4]);
472301348Sarybchik
473301348Sarybchikextern	__checkReturn		efx_rc_t
474301348Sarybchikef10_nvram_partn_set_version(
475301348Sarybchik	__in			efx_nic_t *enp,
476301348Sarybchik	__in			uint32_t partn,
477301348Sarybchik	__in_ecount(4)		uint16_t version[4]);
478301348Sarybchik
479301348Sarybchikextern	__checkReturn		efx_rc_t
480301348Sarybchikef10_nvram_buffer_validate(
481301348Sarybchik	__in			efx_nic_t *enp,
482301348Sarybchik	__in			uint32_t partn,
483301348Sarybchik	__in_bcount(buffer_size)
484301348Sarybchik				caddr_t bufferp,
485301348Sarybchik	__in			size_t buffer_size);
486301348Sarybchik
487301348Sarybchikextern	__checkReturn		efx_rc_t
488301348Sarybchikef10_nvram_buffer_create(
489301348Sarybchik	__in			efx_nic_t *enp,
490301348Sarybchik	__in			uint16_t partn_type,
491301348Sarybchik	__in_bcount(buffer_size)
492301348Sarybchik				caddr_t bufferp,
493301348Sarybchik	__in			size_t buffer_size);
494301348Sarybchik
495301348Sarybchikextern	__checkReturn		efx_rc_t
496301348Sarybchikef10_nvram_buffer_find_item_start(
497301348Sarybchik	__in_bcount(buffer_size)
498301348Sarybchik				caddr_t bufferp,
499301348Sarybchik	__in			size_t buffer_size,
500301348Sarybchik	__out			uint32_t *startp
501301348Sarybchik	);
502301348Sarybchik
503301348Sarybchikextern	__checkReturn		efx_rc_t
504301348Sarybchikef10_nvram_buffer_find_end(
505301348Sarybchik	__in_bcount(buffer_size)
506301348Sarybchik				caddr_t bufferp,
507301348Sarybchik	__in			size_t buffer_size,
508301348Sarybchik	__in			uint32_t offset,
509301348Sarybchik	__out			uint32_t *endp
510301348Sarybchik	);
511301348Sarybchik
512301348Sarybchikextern	__checkReturn	__success(return != B_FALSE)	boolean_t
513301348Sarybchikef10_nvram_buffer_find_item(
514301348Sarybchik	__in_bcount(buffer_size)
515301348Sarybchik				caddr_t bufferp,
516301348Sarybchik	__in			size_t buffer_size,
517301348Sarybchik	__in			uint32_t offset,
518301348Sarybchik	__out			uint32_t *startp,
519301348Sarybchik	__out			uint32_t *lengthp
520301348Sarybchik	);
521301348Sarybchik
522301348Sarybchikextern	__checkReturn		efx_rc_t
523301348Sarybchikef10_nvram_buffer_get_item(
524301348Sarybchik	__in_bcount(buffer_size)
525301348Sarybchik				caddr_t bufferp,
526301348Sarybchik	__in			size_t buffer_size,
527301348Sarybchik	__in			uint32_t offset,
528301348Sarybchik	__in			uint32_t length,
529301348Sarybchik	__out_bcount_part(item_max_size, *lengthp)
530301348Sarybchik				caddr_t itemp,
531301348Sarybchik	__in			size_t item_max_size,
532301348Sarybchik	__out			uint32_t *lengthp
533301348Sarybchik	);
534301348Sarybchik
535301348Sarybchikextern	__checkReturn		efx_rc_t
536301348Sarybchikef10_nvram_buffer_insert_item(
537301348Sarybchik	__in_bcount(buffer_size)
538301348Sarybchik				caddr_t bufferp,
539301348Sarybchik	__in			size_t buffer_size,
540301348Sarybchik	__in			uint32_t offset,
541301348Sarybchik	__in_bcount(length)	caddr_t keyp,
542301348Sarybchik	__in			uint32_t length,
543301348Sarybchik	__out			uint32_t *lengthp
544301348Sarybchik	);
545301348Sarybchik
546301348Sarybchikextern	__checkReturn		efx_rc_t
547301348Sarybchikef10_nvram_buffer_delete_item(
548301348Sarybchik	__in_bcount(buffer_size)
549301348Sarybchik				caddr_t bufferp,
550301348Sarybchik	__in			size_t buffer_size,
551301348Sarybchik	__in			uint32_t offset,
552301348Sarybchik	__in			uint32_t length,
553301348Sarybchik	__in			uint32_t end
554301348Sarybchik	);
555301348Sarybchik
556301348Sarybchikextern	__checkReturn		efx_rc_t
557301348Sarybchikef10_nvram_buffer_finish(
558301348Sarybchik	__in_bcount(buffer_size)
559301348Sarybchik				caddr_t bufferp,
560301348Sarybchik	__in			size_t buffer_size
561301348Sarybchik	);
562301348Sarybchik
563301348Sarybchik#endif	/* EFSYS_OPT_NVRAM */
564301348Sarybchik
565301348Sarybchik
566301348Sarybchik/* PHY */
567301348Sarybchik
568301348Sarybchiktypedef struct ef10_link_state_s {
569301348Sarybchik	uint32_t		els_adv_cap_mask;
570301348Sarybchik	uint32_t		els_lp_cap_mask;
571301348Sarybchik	unsigned int		els_fcntl;
572301348Sarybchik	efx_link_mode_t		els_link_mode;
573301348Sarybchik#if EFSYS_OPT_LOOPBACK
574301348Sarybchik	efx_loopback_type_t	els_loopback;
575301348Sarybchik#endif
576301348Sarybchik	boolean_t		els_mac_up;
577301348Sarybchik} ef10_link_state_t;
578301348Sarybchik
579301348Sarybchikextern			void
580301348Sarybchikef10_phy_link_ev(
581301348Sarybchik	__in		efx_nic_t *enp,
582301348Sarybchik	__in		efx_qword_t *eqp,
583301348Sarybchik	__out		efx_link_mode_t *link_modep);
584301348Sarybchik
585301348Sarybchikextern	__checkReturn	efx_rc_t
586301348Sarybchikef10_phy_get_link(
587301348Sarybchik	__in		efx_nic_t *enp,
588301348Sarybchik	__out		ef10_link_state_t *elsp);
589301348Sarybchik
590301348Sarybchikextern	__checkReturn	efx_rc_t
591301348Sarybchikef10_phy_power(
592301348Sarybchik	__in		efx_nic_t *enp,
593301348Sarybchik	__in		boolean_t on);
594301348Sarybchik
595301348Sarybchikextern	__checkReturn	efx_rc_t
596301348Sarybchikef10_phy_reconfigure(
597301348Sarybchik	__in		efx_nic_t *enp);
598301348Sarybchik
599301348Sarybchikextern	__checkReturn	efx_rc_t
600301348Sarybchikef10_phy_verify(
601301348Sarybchik	__in		efx_nic_t *enp);
602301348Sarybchik
603301348Sarybchikextern	__checkReturn	efx_rc_t
604301348Sarybchikef10_phy_oui_get(
605301348Sarybchik	__in		efx_nic_t *enp,
606301348Sarybchik	__out		uint32_t *ouip);
607301348Sarybchik
608301348Sarybchik#if EFSYS_OPT_PHY_STATS
609301348Sarybchik
610301348Sarybchikextern	__checkReturn			efx_rc_t
611301348Sarybchikef10_phy_stats_update(
612301348Sarybchik	__in				efx_nic_t *enp,
613301348Sarybchik	__in				efsys_mem_t *esmp,
614301348Sarybchik	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
615301348Sarybchik
616301348Sarybchik#endif	/* EFSYS_OPT_PHY_STATS */
617301348Sarybchik
618311074Sarybchik#if EFSYS_OPT_BIST
619301348Sarybchik
620311074Sarybchikextern	__checkReturn		efx_rc_t
621311074Sarybchikef10_bist_enable_offline(
622311074Sarybchik	__in			efx_nic_t *enp);
623311074Sarybchik
624311074Sarybchikextern	__checkReturn		efx_rc_t
625311074Sarybchikef10_bist_start(
626311074Sarybchik	__in			efx_nic_t *enp,
627311074Sarybchik	__in			efx_bist_type_t type);
628311074Sarybchik
629311074Sarybchikextern	__checkReturn		efx_rc_t
630311074Sarybchikef10_bist_poll(
631311074Sarybchik	__in			efx_nic_t *enp,
632311074Sarybchik	__in			efx_bist_type_t type,
633311074Sarybchik	__out			efx_bist_result_t *resultp,
634311074Sarybchik	__out_opt __drv_when(count > 0, __notnull)
635311074Sarybchik	uint32_t	*value_maskp,
636311074Sarybchik	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
637311074Sarybchik	unsigned long	*valuesp,
638311074Sarybchik	__in			size_t count);
639311074Sarybchik
640311074Sarybchikextern				void
641311074Sarybchikef10_bist_stop(
642311074Sarybchik	__in			efx_nic_t *enp,
643311074Sarybchik	__in			efx_bist_type_t type);
644311074Sarybchik
645311074Sarybchik#endif	/* EFSYS_OPT_BIST */
646311074Sarybchik
647301348Sarybchik/* TX */
648301348Sarybchik
649301348Sarybchikextern	__checkReturn	efx_rc_t
650301348Sarybchikef10_tx_init(
651301348Sarybchik	__in		efx_nic_t *enp);
652301348Sarybchik
653301348Sarybchikextern			void
654301348Sarybchikef10_tx_fini(
655301348Sarybchik	__in		efx_nic_t *enp);
656301348Sarybchik
657301348Sarybchikextern	__checkReturn	efx_rc_t
658301348Sarybchikef10_tx_qcreate(
659301348Sarybchik	__in		efx_nic_t *enp,
660301348Sarybchik	__in		unsigned int index,
661301348Sarybchik	__in		unsigned int label,
662301348Sarybchik	__in		efsys_mem_t *esmp,
663301348Sarybchik	__in		size_t n,
664301348Sarybchik	__in		uint32_t id,
665301348Sarybchik	__in		uint16_t flags,
666301348Sarybchik	__in		efx_evq_t *eep,
667301348Sarybchik	__in		efx_txq_t *etp,
668301348Sarybchik	__out		unsigned int *addedp);
669301348Sarybchik
670301348Sarybchikextern		void
671301348Sarybchikef10_tx_qdestroy(
672301348Sarybchik	__in		efx_txq_t *etp);
673301348Sarybchik
674301348Sarybchikextern	__checkReturn	efx_rc_t
675301348Sarybchikef10_tx_qpost(
676301348Sarybchik	__in		efx_txq_t *etp,
677301348Sarybchik	__in_ecount(n)	efx_buffer_t *eb,
678301348Sarybchik	__in		unsigned int n,
679301348Sarybchik	__in		unsigned int completed,
680301348Sarybchik	__inout		unsigned int *addedp);
681301348Sarybchik
682301348Sarybchikextern			void
683301348Sarybchikef10_tx_qpush(
684301348Sarybchik	__in		efx_txq_t *etp,
685301348Sarybchik	__in		unsigned int added,
686301348Sarybchik	__in		unsigned int pushed);
687301348Sarybchik
688301348Sarybchikextern	__checkReturn	efx_rc_t
689301348Sarybchikef10_tx_qpace(
690301348Sarybchik	__in		efx_txq_t *etp,
691301348Sarybchik	__in		unsigned int ns);
692301348Sarybchik
693301348Sarybchikextern	__checkReturn	efx_rc_t
694301348Sarybchikef10_tx_qflush(
695301348Sarybchik	__in		efx_txq_t *etp);
696301348Sarybchik
697301348Sarybchikextern			void
698301348Sarybchikef10_tx_qenable(
699301348Sarybchik	__in		efx_txq_t *etp);
700301348Sarybchik
701301348Sarybchikextern	__checkReturn	efx_rc_t
702301348Sarybchikef10_tx_qpio_enable(
703301348Sarybchik	__in		efx_txq_t *etp);
704301348Sarybchik
705301348Sarybchikextern			void
706301348Sarybchikef10_tx_qpio_disable(
707301348Sarybchik	__in		efx_txq_t *etp);
708301348Sarybchik
709301348Sarybchikextern	__checkReturn	efx_rc_t
710301348Sarybchikef10_tx_qpio_write(
711301348Sarybchik	__in			efx_txq_t *etp,
712301348Sarybchik	__in_ecount(buf_length)	uint8_t *buffer,
713301348Sarybchik	__in			size_t buf_length,
714301348Sarybchik	__in			size_t pio_buf_offset);
715301348Sarybchik
716301348Sarybchikextern	__checkReturn	efx_rc_t
717301348Sarybchikef10_tx_qpio_post(
718301348Sarybchik	__in			efx_txq_t *etp,
719301348Sarybchik	__in			size_t pkt_length,
720301348Sarybchik	__in			unsigned int completed,
721301348Sarybchik	__inout			unsigned int *addedp);
722301348Sarybchik
723301348Sarybchikextern	__checkReturn	efx_rc_t
724301348Sarybchikef10_tx_qdesc_post(
725301348Sarybchik	__in		efx_txq_t *etp,
726301348Sarybchik	__in_ecount(n)	efx_desc_t *ed,
727301348Sarybchik	__in		unsigned int n,
728301348Sarybchik	__in		unsigned int completed,
729301348Sarybchik	__inout		unsigned int *addedp);
730301348Sarybchik
731301348Sarybchikextern	void
732301348Sarybchikef10_tx_qdesc_dma_create(
733301348Sarybchik	__in	efx_txq_t *etp,
734301348Sarybchik	__in	efsys_dma_addr_t addr,
735301348Sarybchik	__in	size_t size,
736301348Sarybchik	__in	boolean_t eop,
737301348Sarybchik	__out	efx_desc_t *edp);
738301348Sarybchik
739301348Sarybchikextern	void
740301348Sarybchikef10_tx_qdesc_tso_create(
741301348Sarybchik	__in	efx_txq_t *etp,
742301348Sarybchik	__in	uint16_t ipv4_id,
743301348Sarybchik	__in	uint32_t tcp_seq,
744301348Sarybchik	__in	uint8_t	 tcp_flags,
745301348Sarybchik	__out	efx_desc_t *edp);
746301348Sarybchik
747301348Sarybchikextern	void
748301348Sarybchikef10_tx_qdesc_tso2_create(
749301348Sarybchik	__in			efx_txq_t *etp,
750301348Sarybchik	__in			uint16_t ipv4_id,
751301348Sarybchik	__in			uint32_t tcp_seq,
752301348Sarybchik	__in			uint16_t tcp_mss,
753301348Sarybchik	__out_ecount(count)	efx_desc_t *edp,
754301348Sarybchik	__in			int count);
755301348Sarybchik
756301348Sarybchikextern	void
757301348Sarybchikef10_tx_qdesc_vlantci_create(
758301348Sarybchik	__in	efx_txq_t *etp,
759301348Sarybchik	__in	uint16_t vlan_tci,
760301348Sarybchik	__out	efx_desc_t *edp);
761301348Sarybchik
762342509Sarybchikextern	void
763342509Sarybchikef10_tx_qdesc_checksum_create(
764342509Sarybchik	__in	efx_txq_t *etp,
765342509Sarybchik	__in	uint16_t flags,
766342509Sarybchik	__out	efx_desc_t *edp);
767301348Sarybchik
768301348Sarybchik#if EFSYS_OPT_QSTATS
769301348Sarybchik
770301348Sarybchikextern			void
771301348Sarybchikef10_tx_qstats_update(
772301348Sarybchik	__in				efx_txq_t *etp,
773301348Sarybchik	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
774301348Sarybchik
775301348Sarybchik#endif /* EFSYS_OPT_QSTATS */
776301348Sarybchik
777301348Sarybchiktypedef uint32_t	efx_piobuf_handle_t;
778301348Sarybchik
779301348Sarybchik#define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
780301348Sarybchik
781301348Sarybchikextern	__checkReturn	efx_rc_t
782301348Sarybchikef10_nic_pio_alloc(
783301348Sarybchik	__inout		efx_nic_t *enp,
784301348Sarybchik	__out		uint32_t *bufnump,
785301348Sarybchik	__out		efx_piobuf_handle_t *handlep,
786301348Sarybchik	__out		uint32_t *blknump,
787301348Sarybchik	__out		uint32_t *offsetp,
788301348Sarybchik	__out		size_t *sizep);
789301348Sarybchik
790301348Sarybchikextern	__checkReturn	efx_rc_t
791301348Sarybchikef10_nic_pio_free(
792301348Sarybchik	__inout		efx_nic_t *enp,
793301348Sarybchik	__in		uint32_t bufnum,
794301348Sarybchik	__in		uint32_t blknum);
795301348Sarybchik
796301348Sarybchikextern	__checkReturn	efx_rc_t
797301348Sarybchikef10_nic_pio_link(
798301348Sarybchik	__inout		efx_nic_t *enp,
799301348Sarybchik	__in		uint32_t vi_index,
800301348Sarybchik	__in		efx_piobuf_handle_t handle);
801301348Sarybchik
802301348Sarybchikextern	__checkReturn	efx_rc_t
803301348Sarybchikef10_nic_pio_unlink(
804301348Sarybchik	__inout		efx_nic_t *enp,
805301348Sarybchik	__in		uint32_t vi_index);
806301348Sarybchik
807301348Sarybchik
808301348Sarybchik/* VPD */
809301348Sarybchik
810301348Sarybchik#if EFSYS_OPT_VPD
811301348Sarybchik
812301348Sarybchikextern	__checkReturn		efx_rc_t
813301348Sarybchikef10_vpd_init(
814301348Sarybchik	__in			efx_nic_t *enp);
815301348Sarybchik
816301348Sarybchikextern	__checkReturn		efx_rc_t
817301348Sarybchikef10_vpd_size(
818301348Sarybchik	__in			efx_nic_t *enp,
819301348Sarybchik	__out			size_t *sizep);
820301348Sarybchik
821301348Sarybchikextern	__checkReturn		efx_rc_t
822301348Sarybchikef10_vpd_read(
823301348Sarybchik	__in			efx_nic_t *enp,
824301348Sarybchik	__out_bcount(size)	caddr_t data,
825301348Sarybchik	__in			size_t size);
826301348Sarybchik
827301348Sarybchikextern	__checkReturn		efx_rc_t
828301348Sarybchikef10_vpd_verify(
829301348Sarybchik	__in			efx_nic_t *enp,
830301348Sarybchik	__in_bcount(size)	caddr_t data,
831301348Sarybchik	__in			size_t size);
832301348Sarybchik
833301348Sarybchikextern	__checkReturn		efx_rc_t
834301348Sarybchikef10_vpd_reinit(
835301348Sarybchik	__in			efx_nic_t *enp,
836301348Sarybchik	__in_bcount(size)	caddr_t data,
837301348Sarybchik	__in			size_t size);
838301348Sarybchik
839301348Sarybchikextern	__checkReturn		efx_rc_t
840301348Sarybchikef10_vpd_get(
841301348Sarybchik	__in			efx_nic_t *enp,
842301348Sarybchik	__in_bcount(size)	caddr_t data,
843301348Sarybchik	__in			size_t size,
844301348Sarybchik	__inout			efx_vpd_value_t *evvp);
845301348Sarybchik
846301348Sarybchikextern	__checkReturn		efx_rc_t
847301348Sarybchikef10_vpd_set(
848301348Sarybchik	__in			efx_nic_t *enp,
849301348Sarybchik	__in_bcount(size)	caddr_t data,
850301348Sarybchik	__in			size_t size,
851301348Sarybchik	__in			efx_vpd_value_t *evvp);
852301348Sarybchik
853301348Sarybchikextern	__checkReturn		efx_rc_t
854301348Sarybchikef10_vpd_next(
855301348Sarybchik	__in			efx_nic_t *enp,
856301348Sarybchik	__in_bcount(size)	caddr_t data,
857301348Sarybchik	__in			size_t size,
858301348Sarybchik	__out			efx_vpd_value_t *evvp,
859301348Sarybchik	__inout			unsigned int *contp);
860301348Sarybchik
861301348Sarybchikextern __checkReturn		efx_rc_t
862301348Sarybchikef10_vpd_write(
863301348Sarybchik	__in			efx_nic_t *enp,
864301348Sarybchik	__in_bcount(size)	caddr_t data,
865301348Sarybchik	__in			size_t size);
866301348Sarybchik
867301348Sarybchikextern				void
868301348Sarybchikef10_vpd_fini(
869301348Sarybchik	__in			efx_nic_t *enp);
870301348Sarybchik
871301348Sarybchik#endif	/* EFSYS_OPT_VPD */
872301348Sarybchik
873301348Sarybchik
874301348Sarybchik/* RX */
875301348Sarybchik
876301348Sarybchikextern	__checkReturn	efx_rc_t
877301348Sarybchikef10_rx_init(
878301348Sarybchik	__in		efx_nic_t *enp);
879301348Sarybchik
880301348Sarybchik#if EFSYS_OPT_RX_SCATTER
881301348Sarybchikextern	__checkReturn	efx_rc_t
882301348Sarybchikef10_rx_scatter_enable(
883301348Sarybchik	__in		efx_nic_t *enp,
884301348Sarybchik	__in		unsigned int buf_size);
885301348Sarybchik#endif	/* EFSYS_OPT_RX_SCATTER */
886301348Sarybchik
887301348Sarybchik
888301348Sarybchik#if EFSYS_OPT_RX_SCALE
889301348Sarybchik
890301348Sarybchikextern	__checkReturn	efx_rc_t
891301348Sarybchikef10_rx_scale_mode_set(
892301348Sarybchik	__in		efx_nic_t *enp,
893301348Sarybchik	__in		efx_rx_hash_alg_t alg,
894301348Sarybchik	__in		efx_rx_hash_type_t type,
895301348Sarybchik	__in		boolean_t insert);
896301348Sarybchik
897301348Sarybchikextern	__checkReturn	efx_rc_t
898301348Sarybchikef10_rx_scale_key_set(
899301348Sarybchik	__in		efx_nic_t *enp,
900301348Sarybchik	__in_ecount(n)	uint8_t *key,
901301348Sarybchik	__in		size_t n);
902301348Sarybchik
903301348Sarybchikextern	__checkReturn	efx_rc_t
904301348Sarybchikef10_rx_scale_tbl_set(
905301348Sarybchik	__in		efx_nic_t *enp,
906301348Sarybchik	__in_ecount(n)	unsigned int *table,
907301348Sarybchik	__in		size_t n);
908301348Sarybchik
909301348Sarybchikextern	__checkReturn	uint32_t
910301348Sarybchikef10_rx_prefix_hash(
911301348Sarybchik	__in		efx_nic_t *enp,
912301348Sarybchik	__in		efx_rx_hash_alg_t func,
913301348Sarybchik	__in		uint8_t *buffer);
914301348Sarybchik
915301348Sarybchik#endif /* EFSYS_OPT_RX_SCALE */
916301348Sarybchik
917301348Sarybchikextern	__checkReturn	efx_rc_t
918301348Sarybchikef10_rx_prefix_pktlen(
919301348Sarybchik	__in		efx_nic_t *enp,
920301348Sarybchik	__in		uint8_t *buffer,
921301348Sarybchik	__out		uint16_t *lengthp);
922301348Sarybchik
923301348Sarybchikextern			void
924301348Sarybchikef10_rx_qpost(
925301348Sarybchik	__in		efx_rxq_t *erp,
926301348Sarybchik	__in_ecount(n)	efsys_dma_addr_t *addrp,
927301348Sarybchik	__in		size_t size,
928301348Sarybchik	__in		unsigned int n,
929301348Sarybchik	__in		unsigned int completed,
930301348Sarybchik	__in		unsigned int added);
931301348Sarybchik
932301348Sarybchikextern			void
933301348Sarybchikef10_rx_qpush(
934301348Sarybchik	__in		efx_rxq_t *erp,
935301348Sarybchik	__in		unsigned int added,
936301348Sarybchik	__inout		unsigned int *pushedp);
937301348Sarybchik
938301348Sarybchikextern	__checkReturn	efx_rc_t
939301348Sarybchikef10_rx_qflush(
940301348Sarybchik	__in		efx_rxq_t *erp);
941301348Sarybchik
942301348Sarybchikextern		void
943301348Sarybchikef10_rx_qenable(
944301348Sarybchik	__in		efx_rxq_t *erp);
945301348Sarybchik
946301348Sarybchikextern	__checkReturn	efx_rc_t
947301348Sarybchikef10_rx_qcreate(
948301348Sarybchik	__in		efx_nic_t *enp,
949301348Sarybchik	__in		unsigned int index,
950301348Sarybchik	__in		unsigned int label,
951301348Sarybchik	__in		efx_rxq_type_t type,
952301348Sarybchik	__in		efsys_mem_t *esmp,
953301348Sarybchik	__in		size_t n,
954301348Sarybchik	__in		uint32_t id,
955301348Sarybchik	__in		efx_evq_t *eep,
956301348Sarybchik	__in		efx_rxq_t *erp);
957301348Sarybchik
958301348Sarybchikextern			void
959301348Sarybchikef10_rx_qdestroy(
960301348Sarybchik	__in		efx_rxq_t *erp);
961301348Sarybchik
962301348Sarybchikextern			void
963301348Sarybchikef10_rx_fini(
964301348Sarybchik	__in		efx_nic_t *enp);
965301348Sarybchik
966301348Sarybchik#if EFSYS_OPT_FILTER
967301348Sarybchik
968301348Sarybchiktypedef struct ef10_filter_handle_s {
969301348Sarybchik	uint32_t	efh_lo;
970301348Sarybchik	uint32_t	efh_hi;
971301348Sarybchik} ef10_filter_handle_t;
972301348Sarybchik
973301348Sarybchiktypedef struct ef10_filter_entry_s {
974301348Sarybchik	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
975301348Sarybchik	ef10_filter_handle_t efe_handle;
976301348Sarybchik} ef10_filter_entry_t;
977301348Sarybchik
978301348Sarybchik/*
979301348Sarybchik * BUSY flag indicates that an update is in progress.
980301348Sarybchik * AUTO_OLD flag is used to mark and sweep MAC packet filters.
981301348Sarybchik */
982301348Sarybchik#define	EFX_EF10_FILTER_FLAG_BUSY	1U
983301348Sarybchik#define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
984301348Sarybchik#define	EFX_EF10_FILTER_FLAGS		3U
985301348Sarybchik
986301348Sarybchik/*
987301348Sarybchik * Size of the hash table used by the driver. Doesn't need to be the
988301348Sarybchik * same size as the hardware's table.
989301348Sarybchik */
990301348Sarybchik#define	EFX_EF10_FILTER_TBL_ROWS 8192
991301348Sarybchik
992301348Sarybchik/* Only need to allow for one directed and one unknown unicast filter */
993301348Sarybchik#define	EFX_EF10_FILTER_UNICAST_FILTERS_MAX	2
994301348Sarybchik
995301348Sarybchik/* Allow for the broadcast address to be added to the multicast list */
996301348Sarybchik#define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
997301348Sarybchik
998342487Sarybchik/*
999342487Sarybchik * For encapsulated packets, there is one filter each for each combination of
1000342487Sarybchik * IPv4 or IPv6 outer frame, VXLAN, GENEVE or NVGRE packet type, and unicast or
1001342487Sarybchik * multicast inner frames.
1002342487Sarybchik */
1003342487Sarybchik#define EFX_EF10_FILTER_ENCAP_FILTERS_MAX	12
1004342487Sarybchik
1005301348Sarybchiktypedef struct ef10_filter_table_s {
1006301348Sarybchik	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
1007311051Sarybchik	efx_rxq_t		*eft_default_rxq;
1008301348Sarybchik	boolean_t		eft_using_rss;
1009301348Sarybchik	uint32_t		eft_unicst_filter_indexes[
1010301348Sarybchik	    EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
1011311069Sarybchik	uint32_t		eft_unicst_filter_count;
1012301348Sarybchik	uint32_t		eft_mulcst_filter_indexes[
1013301348Sarybchik	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
1014301348Sarybchik	uint32_t		eft_mulcst_filter_count;
1015301348Sarybchik	boolean_t		eft_using_all_mulcst;
1016342487Sarybchik	uint32_t		eft_encap_filter_indexes[
1017342487Sarybchik	    EFX_EF10_FILTER_ENCAP_FILTERS_MAX];
1018342487Sarybchik	uint32_t		eft_encap_filter_count;
1019301348Sarybchik} ef10_filter_table_t;
1020301348Sarybchik
1021301348Sarybchik	__checkReturn	efx_rc_t
1022301348Sarybchikef10_filter_init(
1023301348Sarybchik	__in		efx_nic_t *enp);
1024301348Sarybchik
1025301348Sarybchik			void
1026301348Sarybchikef10_filter_fini(
1027301348Sarybchik	__in		efx_nic_t *enp);
1028301348Sarybchik
1029301348Sarybchik	__checkReturn	efx_rc_t
1030301348Sarybchikef10_filter_restore(
1031301348Sarybchik	__in		efx_nic_t *enp);
1032301348Sarybchik
1033301348Sarybchik	__checkReturn	efx_rc_t
1034301348Sarybchikef10_filter_add(
1035301348Sarybchik	__in		efx_nic_t *enp,
1036301348Sarybchik	__inout		efx_filter_spec_t *spec,
1037301348Sarybchik	__in		boolean_t may_replace);
1038301348Sarybchik
1039301348Sarybchik	__checkReturn	efx_rc_t
1040301348Sarybchikef10_filter_delete(
1041301348Sarybchik	__in		efx_nic_t *enp,
1042301348Sarybchik	__inout		efx_filter_spec_t *spec);
1043301348Sarybchik
1044301348Sarybchikextern	__checkReturn	efx_rc_t
1045301348Sarybchikef10_filter_supported_filters(
1046311494Sarybchik	__in				efx_nic_t *enp,
1047311494Sarybchik	__out_ecount(buffer_length)	uint32_t *buffer,
1048311494Sarybchik	__in				size_t buffer_length,
1049311494Sarybchik	__out				size_t *list_lengthp);
1050301348Sarybchik
1051301348Sarybchikextern	__checkReturn	efx_rc_t
1052301348Sarybchikef10_filter_reconfigure(
1053301348Sarybchik	__in				efx_nic_t *enp,
1054301348Sarybchik	__in_ecount(6)			uint8_t const *mac_addr,
1055301348Sarybchik	__in				boolean_t all_unicst,
1056301348Sarybchik	__in				boolean_t mulcst,
1057301348Sarybchik	__in				boolean_t all_mulcst,
1058301348Sarybchik	__in				boolean_t brdcst,
1059301348Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
1060301348Sarybchik	__in				uint32_t count);
1061301348Sarybchik
1062301348Sarybchikextern		void
1063301348Sarybchikef10_filter_get_default_rxq(
1064301348Sarybchik	__in		efx_nic_t *enp,
1065301348Sarybchik	__out		efx_rxq_t **erpp,
1066301348Sarybchik	__out		boolean_t *using_rss);
1067301348Sarybchik
1068301348Sarybchikextern		void
1069301348Sarybchikef10_filter_default_rxq_set(
1070301348Sarybchik	__in		efx_nic_t *enp,
1071301348Sarybchik	__in		efx_rxq_t *erp,
1072301348Sarybchik	__in		boolean_t using_rss);
1073301348Sarybchik
1074301348Sarybchikextern		void
1075301348Sarybchikef10_filter_default_rxq_clear(
1076301348Sarybchik	__in		efx_nic_t *enp);
1077301348Sarybchik
1078301348Sarybchik
1079301348Sarybchik#endif /* EFSYS_OPT_FILTER */
1080301348Sarybchik
1081301348Sarybchikextern	__checkReturn			efx_rc_t
1082301348Sarybchikefx_mcdi_get_function_info(
1083301348Sarybchik	__in				efx_nic_t *enp,
1084301348Sarybchik	__out				uint32_t *pfp,
1085301348Sarybchik	__out_opt			uint32_t *vfp);
1086301348Sarybchik
1087301348Sarybchikextern	__checkReturn		efx_rc_t
1088301348Sarybchikefx_mcdi_privilege_mask(
1089301348Sarybchik	__in			efx_nic_t *enp,
1090301348Sarybchik	__in			uint32_t pf,
1091301348Sarybchik	__in			uint32_t vf,
1092301348Sarybchik	__out			uint32_t *maskp);
1093301348Sarybchik
1094301348Sarybchikextern	__checkReturn	efx_rc_t
1095294377Sarybchikefx_mcdi_get_port_assignment(
1096294377Sarybchik	__in		efx_nic_t *enp,
1097294377Sarybchik	__out		uint32_t *portp);
1098293734Sarybchik
1099294377Sarybchikextern	__checkReturn	efx_rc_t
1100294377Sarybchikefx_mcdi_get_port_modes(
1101294377Sarybchik	__in		efx_nic_t *enp,
1102301365Sarybchik	__out		uint32_t *modesp,
1103301365Sarybchik	__out_opt	uint32_t *current_modep);
1104293734Sarybchik
1105294377Sarybchikextern	__checkReturn	efx_rc_t
1106301365Sarybchikef10_nic_get_port_mode_bandwidth(
1107301365Sarybchik	__in		uint32_t port_mode,
1108301365Sarybchik	__out		uint32_t *bandwidth_mbpsp);
1109301365Sarybchik
1110301365Sarybchikextern	__checkReturn	efx_rc_t
1111294377Sarybchikefx_mcdi_get_mac_address_pf(
1112294377Sarybchik	__in			efx_nic_t *enp,
1113294377Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1114294377Sarybchik
1115294377Sarybchikextern	__checkReturn	efx_rc_t
1116294377Sarybchikefx_mcdi_get_mac_address_vf(
1117294377Sarybchik	__in			efx_nic_t *enp,
1118294377Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1119294377Sarybchik
1120294377Sarybchikextern	__checkReturn	efx_rc_t
1121294377Sarybchikefx_mcdi_get_clock(
1122294377Sarybchik	__in		efx_nic_t *enp,
1123301381Sarybchik	__out		uint32_t *sys_freqp,
1124301381Sarybchik	__out		uint32_t *dpcpu_freqp);
1125294377Sarybchik
1126301381Sarybchik
1127294377Sarybchikextern	__checkReturn	efx_rc_t
1128294377Sarybchikefx_mcdi_get_vector_cfg(
1129294377Sarybchik	__in		efx_nic_t *enp,
1130294377Sarybchik	__out_opt	uint32_t *vec_basep,
1131294377Sarybchik	__out_opt	uint32_t *pf_nvecp,
1132294377Sarybchik	__out_opt	uint32_t *vf_nvecp);
1133294377Sarybchik
1134294377Sarybchikextern	__checkReturn	efx_rc_t
1135294377Sarybchikef10_get_datapath_caps(
1136294377Sarybchik	__in		efx_nic_t *enp);
1137294377Sarybchik
1138294392Sarybchikextern	__checkReturn		efx_rc_t
1139294392Sarybchikef10_get_privilege_mask(
1140294392Sarybchik	__in			efx_nic_t *enp,
1141294392Sarybchik	__out			uint32_t *maskp);
1142294392Sarybchik
1143294377Sarybchikextern	__checkReturn	efx_rc_t
1144294377Sarybchikef10_external_port_mapping(
1145294377Sarybchik	__in		efx_nic_t *enp,
1146294377Sarybchik	__in		uint32_t port,
1147294377Sarybchik	__out		uint8_t *external_portp);
1148294377Sarybchik
1149294377Sarybchik
1150293734Sarybchik#ifdef	__cplusplus
1151293734Sarybchik}
1152293734Sarybchik#endif
1153293734Sarybchik
1154293734Sarybchik#endif	/* _SYS_EF10_IMPL_H */
1155