1293734Sarybchik/*-
2300607Sarybchik * 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/11/sys/dev/sfxge/common/ef10_impl.h 342441 2018-12-25 07:21:35Z 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,
87301122Sarybchik	__in		uint32_t us,
88310939Sarybchik	__in		uint32_t flags,
89299720Sarybchik	__in		efx_evq_t *eep);
90299720Sarybchik
91299720Sarybchik			void
92299720Sarybchikef10_ev_qdestroy(
93299720Sarybchik	__in		efx_evq_t *eep);
94299720Sarybchik
95299720Sarybchik	__checkReturn	efx_rc_t
96299720Sarybchikef10_ev_qprime(
97299720Sarybchik	__in		efx_evq_t *eep,
98299720Sarybchik	__in		unsigned int count);
99299720Sarybchik
100299720Sarybchik			void
101299720Sarybchikef10_ev_qpost(
102299720Sarybchik	__in	efx_evq_t *eep,
103299720Sarybchik	__in	uint16_t data);
104299720Sarybchik
105299720Sarybchik	__checkReturn	efx_rc_t
106299720Sarybchikef10_ev_qmoderate(
107299720Sarybchik	__in		efx_evq_t *eep,
108299720Sarybchik	__in		unsigned int us);
109299720Sarybchik
110299720Sarybchik#if EFSYS_OPT_QSTATS
111299720Sarybchik			void
112299720Sarybchikef10_ev_qstats_update(
113299720Sarybchik	__in				efx_evq_t *eep,
114299720Sarybchik	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
115299720Sarybchik#endif /* EFSYS_OPT_QSTATS */
116299720Sarybchik
117299720Sarybchik		void
118299720Sarybchikef10_ev_rxlabel_init(
119299720Sarybchik	__in		efx_evq_t *eep,
120299720Sarybchik	__in		efx_rxq_t *erp,
121299720Sarybchik	__in		unsigned int label);
122299720Sarybchik
123299720Sarybchik		void
124299720Sarybchikef10_ev_rxlabel_fini(
125299720Sarybchik	__in		efx_evq_t *eep,
126299720Sarybchik	__in		unsigned int label);
127299720Sarybchik
128299720Sarybchik/* INTR */
129299720Sarybchik
130299720Sarybchik	__checkReturn	efx_rc_t
131299720Sarybchikef10_intr_init(
132299720Sarybchik	__in		efx_nic_t *enp,
133299720Sarybchik	__in		efx_intr_type_t type,
134299720Sarybchik	__in		efsys_mem_t *esmp);
135299720Sarybchik
136299720Sarybchik			void
137299720Sarybchikef10_intr_enable(
138299720Sarybchik	__in		efx_nic_t *enp);
139299720Sarybchik
140299720Sarybchik			void
141299720Sarybchikef10_intr_disable(
142299720Sarybchik	__in		efx_nic_t *enp);
143299720Sarybchik
144299720Sarybchik			void
145299720Sarybchikef10_intr_disable_unlocked(
146299720Sarybchik	__in		efx_nic_t *enp);
147299720Sarybchik
148299720Sarybchik	__checkReturn	efx_rc_t
149299720Sarybchikef10_intr_trigger(
150299720Sarybchik	__in		efx_nic_t *enp,
151299720Sarybchik	__in		unsigned int level);
152299720Sarybchik
153299720Sarybchik			void
154299720Sarybchikef10_intr_status_line(
155299720Sarybchik	__in		efx_nic_t *enp,
156299720Sarybchik	__out		boolean_t *fatalp,
157299720Sarybchik	__out		uint32_t *qmaskp);
158299720Sarybchik
159299720Sarybchik			void
160299720Sarybchikef10_intr_status_message(
161299720Sarybchik	__in		efx_nic_t *enp,
162299720Sarybchik	__in		unsigned int message,
163299720Sarybchik	__out		boolean_t *fatalp);
164299720Sarybchik
165299720Sarybchik			void
166299720Sarybchikef10_intr_fatal(
167299720Sarybchik	__in		efx_nic_t *enp);
168299720Sarybchik			void
169299720Sarybchikef10_intr_fini(
170299720Sarybchik	__in		efx_nic_t *enp);
171299720Sarybchik
172299720Sarybchik/* NIC */
173299720Sarybchik
174293887Sarybchikextern	__checkReturn	efx_rc_t
175299720Sarybchikef10_nic_probe(
176299720Sarybchik	__in		efx_nic_t *enp);
177299720Sarybchik
178299720Sarybchikextern	__checkReturn	efx_rc_t
179299720Sarybchikef10_nic_set_drv_limits(
180299720Sarybchik	__inout		efx_nic_t *enp,
181299720Sarybchik	__in		efx_drv_limits_t *edlp);
182299720Sarybchik
183299720Sarybchikextern	__checkReturn	efx_rc_t
184299720Sarybchikef10_nic_get_vi_pool(
185299720Sarybchik	__in		efx_nic_t *enp,
186299720Sarybchik	__out		uint32_t *vi_countp);
187299720Sarybchik
188299720Sarybchikextern	__checkReturn	efx_rc_t
189299720Sarybchikef10_nic_get_bar_region(
190299720Sarybchik	__in		efx_nic_t *enp,
191299720Sarybchik	__in		efx_nic_region_t region,
192299720Sarybchik	__out		uint32_t *offsetp,
193299720Sarybchik	__out		size_t *sizep);
194299720Sarybchik
195299720Sarybchikextern	__checkReturn	efx_rc_t
196299720Sarybchikef10_nic_reset(
197299720Sarybchik	__in		efx_nic_t *enp);
198299720Sarybchik
199299720Sarybchikextern	__checkReturn	efx_rc_t
200299720Sarybchikef10_nic_init(
201299720Sarybchik	__in		efx_nic_t *enp);
202299720Sarybchik
203299720Sarybchik#if EFSYS_OPT_DIAG
204299720Sarybchik
205299720Sarybchikextern	__checkReturn	efx_rc_t
206299720Sarybchikef10_nic_register_test(
207299720Sarybchik	__in		efx_nic_t *enp);
208299720Sarybchik
209299720Sarybchik#endif	/* EFSYS_OPT_DIAG */
210299720Sarybchik
211299720Sarybchikextern			void
212299720Sarybchikef10_nic_fini(
213299720Sarybchik	__in		efx_nic_t *enp);
214299720Sarybchik
215299720Sarybchikextern			void
216299720Sarybchikef10_nic_unprobe(
217299720Sarybchik	__in		efx_nic_t *enp);
218299720Sarybchik
219299720Sarybchik
220299720Sarybchik/* MAC */
221299720Sarybchik
222299720Sarybchikextern	__checkReturn	efx_rc_t
223299720Sarybchikef10_mac_poll(
224299720Sarybchik	__in		efx_nic_t *enp,
225299720Sarybchik	__out		efx_link_mode_t *link_modep);
226299720Sarybchik
227299720Sarybchikextern	__checkReturn	efx_rc_t
228299720Sarybchikef10_mac_up(
229299720Sarybchik	__in		efx_nic_t *enp,
230299720Sarybchik	__out		boolean_t *mac_upp);
231299720Sarybchik
232299720Sarybchikextern	__checkReturn	efx_rc_t
233299720Sarybchikef10_mac_addr_set(
234299720Sarybchik	__in	efx_nic_t *enp);
235299720Sarybchik
236299720Sarybchikextern	__checkReturn	efx_rc_t
237299720Sarybchikef10_mac_pdu_set(
238299720Sarybchik	__in	efx_nic_t *enp);
239299720Sarybchik
240299720Sarybchikextern	__checkReturn	efx_rc_t
241300008Sarybchikef10_mac_pdu_get(
242300008Sarybchik	__in	efx_nic_t *enp,
243300008Sarybchik	__out	size_t *pdu);
244300008Sarybchik
245300008Sarybchikextern	__checkReturn	efx_rc_t
246299720Sarybchikef10_mac_reconfigure(
247299720Sarybchik	__in	efx_nic_t *enp);
248299720Sarybchik
249299720Sarybchikextern	__checkReturn	efx_rc_t
250299720Sarybchikef10_mac_multicast_list_set(
251299720Sarybchik	__in				efx_nic_t *enp);
252299720Sarybchik
253299720Sarybchikextern	__checkReturn	efx_rc_t
254299720Sarybchikef10_mac_filter_default_rxq_set(
255299720Sarybchik	__in		efx_nic_t *enp,
256299720Sarybchik	__in		efx_rxq_t *erp,
257299720Sarybchik	__in		boolean_t using_rss);
258299720Sarybchik
259299720Sarybchikextern			void
260299720Sarybchikef10_mac_filter_default_rxq_clear(
261299720Sarybchik	__in		efx_nic_t *enp);
262299720Sarybchik
263299720Sarybchik#if EFSYS_OPT_LOOPBACK
264299720Sarybchik
265299720Sarybchikextern	__checkReturn	efx_rc_t
266299720Sarybchikef10_mac_loopback_set(
267299720Sarybchik	__in		efx_nic_t *enp,
268299720Sarybchik	__in		efx_link_mode_t link_mode,
269299720Sarybchik	__in		efx_loopback_type_t loopback_type);
270299720Sarybchik
271299720Sarybchik#endif	/* EFSYS_OPT_LOOPBACK */
272299720Sarybchik
273299720Sarybchik#if EFSYS_OPT_MAC_STATS
274299720Sarybchik
275299720Sarybchikextern	__checkReturn			efx_rc_t
276311017Sarybchikef10_mac_stats_get_mask(
277311017Sarybchik	__in				efx_nic_t *enp,
278311017Sarybchik	__inout_bcount(mask_size)	uint32_t *maskp,
279311017Sarybchik	__in				size_t mask_size);
280311017Sarybchik
281311017Sarybchikextern	__checkReturn			efx_rc_t
282299720Sarybchikef10_mac_stats_update(
283299720Sarybchik	__in				efx_nic_t *enp,
284299720Sarybchik	__in				efsys_mem_t *esmp,
285299720Sarybchik	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
286299720Sarybchik	__inout_opt			uint32_t *generationp);
287299720Sarybchik
288299720Sarybchik#endif	/* EFSYS_OPT_MAC_STATS */
289299720Sarybchik
290299720Sarybchik
291299720Sarybchik/* MCDI */
292299720Sarybchik
293299720Sarybchik#if EFSYS_OPT_MCDI
294299720Sarybchik
295299720Sarybchikextern	__checkReturn	efx_rc_t
296299720Sarybchikef10_mcdi_init(
297299720Sarybchik	__in		efx_nic_t *enp,
298299720Sarybchik	__in		const efx_mcdi_transport_t *mtp);
299299720Sarybchik
300299720Sarybchikextern			void
301299720Sarybchikef10_mcdi_fini(
302299720Sarybchik	__in		efx_nic_t *enp);
303299720Sarybchik
304299720Sarybchikextern			void
305299720Sarybchikef10_mcdi_send_request(
306310934Sarybchik	__in			efx_nic_t *enp,
307310934Sarybchik	__in_bcount(hdr_len)	void *hdrp,
308310934Sarybchik	__in			size_t hdr_len,
309310934Sarybchik	__in_bcount(sdu_len)	void *sdup,
310310934Sarybchik	__in			size_t sdu_len);
311299720Sarybchik
312299720Sarybchikextern	__checkReturn	boolean_t
313299720Sarybchikef10_mcdi_poll_response(
314299720Sarybchik	__in		efx_nic_t *enp);
315299720Sarybchik
316299720Sarybchikextern			void
317299720Sarybchikef10_mcdi_read_response(
318299720Sarybchik	__in			efx_nic_t *enp,
319299720Sarybchik	__out_bcount(length)	void *bufferp,
320299720Sarybchik	__in			size_t offset,
321299720Sarybchik	__in			size_t length);
322299720Sarybchik
323299720Sarybchikextern			efx_rc_t
324299720Sarybchikef10_mcdi_poll_reboot(
325299720Sarybchik	__in		efx_nic_t *enp);
326299720Sarybchik
327299720Sarybchikextern	__checkReturn	efx_rc_t
328299720Sarybchikef10_mcdi_feature_supported(
329299720Sarybchik	__in		efx_nic_t *enp,
330299720Sarybchik	__in		efx_mcdi_feature_id_t id,
331299720Sarybchik	__out		boolean_t *supportedp);
332299720Sarybchik
333311486Sarybchikextern			void
334311486Sarybchikef10_mcdi_get_timeout(
335311486Sarybchik	__in		efx_nic_t *enp,
336311486Sarybchik	__in		efx_mcdi_req_t *emrp,
337311486Sarybchik	__out		uint32_t *timeoutp);
338311486Sarybchik
339299720Sarybchik#endif /* EFSYS_OPT_MCDI */
340299720Sarybchik
341299720Sarybchik/* NVRAM */
342299720Sarybchik
343299720Sarybchik#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
344299720Sarybchik
345299720Sarybchikextern	__checkReturn		efx_rc_t
346299720Sarybchikef10_nvram_buf_read_tlv(
347299720Sarybchik	__in				efx_nic_t *enp,
348299720Sarybchik	__in_bcount(max_seg_size)	caddr_t seg_data,
349299720Sarybchik	__in				size_t max_seg_size,
350299720Sarybchik	__in				uint32_t tag,
351299720Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
352299720Sarybchik	__out				size_t *sizep);
353299720Sarybchik
354299720Sarybchikextern	__checkReturn		efx_rc_t
355299720Sarybchikef10_nvram_buf_write_tlv(
356299720Sarybchik	__inout_bcount(partn_size)	caddr_t partn_data,
357299720Sarybchik	__in				size_t partn_size,
358299720Sarybchik	__in				uint32_t tag,
359299720Sarybchik	__in_bcount(tag_size)		caddr_t tag_data,
360299720Sarybchik	__in				size_t tag_size,
361299720Sarybchik	__out				size_t *total_lengthp);
362299720Sarybchik
363299720Sarybchikextern	__checkReturn		efx_rc_t
364299720Sarybchikef10_nvram_partn_read_tlv(
365299720Sarybchik	__in				efx_nic_t *enp,
366299720Sarybchik	__in				uint32_t partn,
367299720Sarybchik	__in				uint32_t tag,
368299720Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
369299720Sarybchik	__out				size_t *sizep);
370299720Sarybchik
371299720Sarybchikextern	__checkReturn		efx_rc_t
372299720Sarybchikef10_nvram_partn_write_tlv(
373299720Sarybchik	__in			efx_nic_t *enp,
374299720Sarybchik	__in			uint32_t partn,
375299720Sarybchik	__in			uint32_t tag,
376299720Sarybchik	__in_bcount(size)	caddr_t data,
377299720Sarybchik	__in			size_t size);
378299720Sarybchik
379299720Sarybchikextern	__checkReturn		efx_rc_t
380299720Sarybchikef10_nvram_partn_write_segment_tlv(
381299720Sarybchik	__in			efx_nic_t *enp,
382299720Sarybchik	__in			uint32_t partn,
383299720Sarybchik	__in			uint32_t tag,
384299720Sarybchik	__in_bcount(size)	caddr_t data,
385299720Sarybchik	__in			size_t size,
386299720Sarybchik	__in			boolean_t all_segments);
387299720Sarybchik
388299720Sarybchikextern	__checkReturn		efx_rc_t
389299720Sarybchikef10_nvram_partn_lock(
390299720Sarybchik	__in			efx_nic_t *enp,
391299720Sarybchik	__in			uint32_t partn);
392299720Sarybchik
393311481Sarybchikextern	__checkReturn		efx_rc_t
394299720Sarybchikef10_nvram_partn_unlock(
395299720Sarybchik	__in			efx_nic_t *enp,
396311488Sarybchik	__in			uint32_t partn,
397311488Sarybchik	__out_opt		uint32_t *resultp);
398299720Sarybchik
399299720Sarybchik#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
400299720Sarybchik
401299720Sarybchik#if EFSYS_OPT_NVRAM
402299720Sarybchik
403299720Sarybchik#if EFSYS_OPT_DIAG
404299720Sarybchik
405299720Sarybchikextern	__checkReturn		efx_rc_t
406299720Sarybchikef10_nvram_test(
407299720Sarybchik	__in			efx_nic_t *enp);
408299720Sarybchik
409299720Sarybchik#endif	/* EFSYS_OPT_DIAG */
410299720Sarybchik
411299720Sarybchikextern	__checkReturn		efx_rc_t
412299720Sarybchikef10_nvram_type_to_partn(
413299720Sarybchik	__in			efx_nic_t *enp,
414299720Sarybchik	__in			efx_nvram_type_t type,
415299720Sarybchik	__out			uint32_t *partnp);
416299720Sarybchik
417299720Sarybchikextern	__checkReturn		efx_rc_t
418299720Sarybchikef10_nvram_partn_size(
419299720Sarybchik	__in			efx_nic_t *enp,
420299720Sarybchik	__in			uint32_t partn,
421299720Sarybchik	__out			size_t *sizep);
422299720Sarybchik
423299720Sarybchikextern	__checkReturn		efx_rc_t
424299720Sarybchikef10_nvram_partn_rw_start(
425299720Sarybchik	__in			efx_nic_t *enp,
426299720Sarybchik	__in			uint32_t partn,
427299720Sarybchik	__out			size_t *chunk_sizep);
428299720Sarybchik
429299720Sarybchikextern	__checkReturn		efx_rc_t
430299720Sarybchikef10_nvram_partn_read_mode(
431299720Sarybchik	__in			efx_nic_t *enp,
432299720Sarybchik	__in			uint32_t partn,
433299720Sarybchik	__in			unsigned int offset,
434299720Sarybchik	__out_bcount(size)	caddr_t data,
435299720Sarybchik	__in			size_t size,
436299720Sarybchik	__in			uint32_t mode);
437299720Sarybchik
438299720Sarybchikextern	__checkReturn		efx_rc_t
439299720Sarybchikef10_nvram_partn_read(
440299720Sarybchik	__in			efx_nic_t *enp,
441299720Sarybchik	__in			uint32_t partn,
442299720Sarybchik	__in			unsigned int offset,
443342441Sarybchik	__in_bcount(size)	caddr_t data,
444299720Sarybchik	__in			size_t size);
445299720Sarybchik
446299720Sarybchikextern	__checkReturn		efx_rc_t
447299720Sarybchikef10_nvram_partn_erase(
448299720Sarybchik	__in			efx_nic_t *enp,
449299720Sarybchik	__in			uint32_t partn,
450299720Sarybchik	__in			unsigned int offset,
451299720Sarybchik	__in			size_t size);
452299720Sarybchik
453299720Sarybchikextern	__checkReturn		efx_rc_t
454299720Sarybchikef10_nvram_partn_write(
455299720Sarybchik	__in			efx_nic_t *enp,
456299720Sarybchik	__in			uint32_t partn,
457299720Sarybchik	__in			unsigned int offset,
458299720Sarybchik	__out_bcount(size)	caddr_t data,
459299720Sarybchik	__in			size_t size);
460299720Sarybchik
461311481Sarybchikextern	__checkReturn		efx_rc_t
462299720Sarybchikef10_nvram_partn_rw_finish(
463299720Sarybchik	__in			efx_nic_t *enp,
464299720Sarybchik	__in			uint32_t partn);
465299720Sarybchik
466299720Sarybchikextern	__checkReturn		efx_rc_t
467299720Sarybchikef10_nvram_partn_get_version(
468299720Sarybchik	__in			efx_nic_t *enp,
469299720Sarybchik	__in			uint32_t partn,
470299720Sarybchik	__out			uint32_t *subtypep,
471299720Sarybchik	__out_ecount(4)		uint16_t version[4]);
472299720Sarybchik
473299720Sarybchikextern	__checkReturn		efx_rc_t
474299720Sarybchikef10_nvram_partn_set_version(
475299720Sarybchik	__in			efx_nic_t *enp,
476299720Sarybchik	__in			uint32_t partn,
477299720Sarybchik	__in_ecount(4)		uint16_t version[4]);
478299720Sarybchik
479299720Sarybchikextern	__checkReturn		efx_rc_t
480299720Sarybchikef10_nvram_buffer_validate(
481299720Sarybchik	__in			efx_nic_t *enp,
482299720Sarybchik	__in			uint32_t partn,
483299720Sarybchik	__in_bcount(buffer_size)
484299720Sarybchik				caddr_t bufferp,
485299720Sarybchik	__in			size_t buffer_size);
486299720Sarybchik
487299720Sarybchikextern	__checkReturn		efx_rc_t
488299720Sarybchikef10_nvram_buffer_create(
489299720Sarybchik	__in			efx_nic_t *enp,
490299720Sarybchik	__in			uint16_t partn_type,
491299720Sarybchik	__in_bcount(buffer_size)
492299720Sarybchik				caddr_t bufferp,
493299720Sarybchik	__in			size_t buffer_size);
494299720Sarybchik
495299720Sarybchikextern	__checkReturn		efx_rc_t
496299720Sarybchikef10_nvram_buffer_find_item_start(
497299720Sarybchik	__in_bcount(buffer_size)
498299720Sarybchik				caddr_t bufferp,
499299720Sarybchik	__in			size_t buffer_size,
500299720Sarybchik	__out			uint32_t *startp
501299720Sarybchik	);
502299720Sarybchik
503299720Sarybchikextern	__checkReturn		efx_rc_t
504299720Sarybchikef10_nvram_buffer_find_end(
505299720Sarybchik	__in_bcount(buffer_size)
506299720Sarybchik				caddr_t bufferp,
507299720Sarybchik	__in			size_t buffer_size,
508299720Sarybchik	__in			uint32_t offset,
509299720Sarybchik	__out			uint32_t *endp
510299720Sarybchik	);
511299720Sarybchik
512299720Sarybchikextern	__checkReturn	__success(return != B_FALSE)	boolean_t
513299720Sarybchikef10_nvram_buffer_find_item(
514299720Sarybchik	__in_bcount(buffer_size)
515299720Sarybchik				caddr_t bufferp,
516299720Sarybchik	__in			size_t buffer_size,
517299720Sarybchik	__in			uint32_t offset,
518299720Sarybchik	__out			uint32_t *startp,
519299720Sarybchik	__out			uint32_t *lengthp
520299720Sarybchik	);
521299720Sarybchik
522299720Sarybchikextern	__checkReturn		efx_rc_t
523299720Sarybchikef10_nvram_buffer_get_item(
524299720Sarybchik	__in_bcount(buffer_size)
525299720Sarybchik				caddr_t bufferp,
526299720Sarybchik	__in			size_t buffer_size,
527299720Sarybchik	__in			uint32_t offset,
528299720Sarybchik	__in			uint32_t length,
529299720Sarybchik	__out_bcount_part(item_max_size, *lengthp)
530299720Sarybchik				caddr_t itemp,
531299720Sarybchik	__in			size_t item_max_size,
532299720Sarybchik	__out			uint32_t *lengthp
533299720Sarybchik	);
534299720Sarybchik
535299720Sarybchikextern	__checkReturn		efx_rc_t
536299720Sarybchikef10_nvram_buffer_insert_item(
537299720Sarybchik	__in_bcount(buffer_size)
538299720Sarybchik				caddr_t bufferp,
539299720Sarybchik	__in			size_t buffer_size,
540299720Sarybchik	__in			uint32_t offset,
541299720Sarybchik	__in_bcount(length)	caddr_t keyp,
542299720Sarybchik	__in			uint32_t length,
543299720Sarybchik	__out			uint32_t *lengthp
544299720Sarybchik	);
545299720Sarybchik
546299720Sarybchikextern	__checkReturn		efx_rc_t
547299720Sarybchikef10_nvram_buffer_delete_item(
548299720Sarybchik	__in_bcount(buffer_size)
549299720Sarybchik				caddr_t bufferp,
550299720Sarybchik	__in			size_t buffer_size,
551299720Sarybchik	__in			uint32_t offset,
552299720Sarybchik	__in			uint32_t length,
553299720Sarybchik	__in			uint32_t end
554299720Sarybchik	);
555299720Sarybchik
556299720Sarybchikextern	__checkReturn		efx_rc_t
557299720Sarybchikef10_nvram_buffer_finish(
558299720Sarybchik	__in_bcount(buffer_size)
559299720Sarybchik				caddr_t bufferp,
560299720Sarybchik	__in			size_t buffer_size
561299720Sarybchik	);
562299720Sarybchik
563299720Sarybchik#endif	/* EFSYS_OPT_NVRAM */
564299720Sarybchik
565299720Sarybchik
566299720Sarybchik/* PHY */
567299720Sarybchik
568299720Sarybchiktypedef struct ef10_link_state_s {
569299720Sarybchik	uint32_t		els_adv_cap_mask;
570299720Sarybchik	uint32_t		els_lp_cap_mask;
571299720Sarybchik	unsigned int		els_fcntl;
572299720Sarybchik	efx_link_mode_t		els_link_mode;
573299720Sarybchik#if EFSYS_OPT_LOOPBACK
574299720Sarybchik	efx_loopback_type_t	els_loopback;
575299720Sarybchik#endif
576299720Sarybchik	boolean_t		els_mac_up;
577299720Sarybchik} ef10_link_state_t;
578299720Sarybchik
579299720Sarybchikextern			void
580299720Sarybchikef10_phy_link_ev(
581299720Sarybchik	__in		efx_nic_t *enp,
582299720Sarybchik	__in		efx_qword_t *eqp,
583299720Sarybchik	__out		efx_link_mode_t *link_modep);
584299720Sarybchik
585299720Sarybchikextern	__checkReturn	efx_rc_t
586299720Sarybchikef10_phy_get_link(
587299720Sarybchik	__in		efx_nic_t *enp,
588299720Sarybchik	__out		ef10_link_state_t *elsp);
589299720Sarybchik
590299720Sarybchikextern	__checkReturn	efx_rc_t
591299720Sarybchikef10_phy_power(
592299720Sarybchik	__in		efx_nic_t *enp,
593299720Sarybchik	__in		boolean_t on);
594299720Sarybchik
595299720Sarybchikextern	__checkReturn	efx_rc_t
596299720Sarybchikef10_phy_reconfigure(
597299720Sarybchik	__in		efx_nic_t *enp);
598299720Sarybchik
599299720Sarybchikextern	__checkReturn	efx_rc_t
600299720Sarybchikef10_phy_verify(
601299720Sarybchik	__in		efx_nic_t *enp);
602299720Sarybchik
603299720Sarybchikextern	__checkReturn	efx_rc_t
604299720Sarybchikef10_phy_oui_get(
605299720Sarybchik	__in		efx_nic_t *enp,
606299720Sarybchik	__out		uint32_t *ouip);
607299720Sarybchik
608299720Sarybchik#if EFSYS_OPT_PHY_STATS
609299720Sarybchik
610299720Sarybchikextern	__checkReturn			efx_rc_t
611299720Sarybchikef10_phy_stats_update(
612299720Sarybchik	__in				efx_nic_t *enp,
613299720Sarybchik	__in				efsys_mem_t *esmp,
614299720Sarybchik	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
615299720Sarybchik
616299720Sarybchik#endif	/* EFSYS_OPT_PHY_STATS */
617299720Sarybchik
618310944Sarybchik#if EFSYS_OPT_BIST
619299720Sarybchik
620310944Sarybchikextern	__checkReturn		efx_rc_t
621310944Sarybchikef10_bist_enable_offline(
622310944Sarybchik	__in			efx_nic_t *enp);
623310944Sarybchik
624310944Sarybchikextern	__checkReturn		efx_rc_t
625310944Sarybchikef10_bist_start(
626310944Sarybchik	__in			efx_nic_t *enp,
627310944Sarybchik	__in			efx_bist_type_t type);
628310944Sarybchik
629310944Sarybchikextern	__checkReturn		efx_rc_t
630310944Sarybchikef10_bist_poll(
631310944Sarybchik	__in			efx_nic_t *enp,
632310944Sarybchik	__in			efx_bist_type_t type,
633310944Sarybchik	__out			efx_bist_result_t *resultp,
634310944Sarybchik	__out_opt __drv_when(count > 0, __notnull)
635310944Sarybchik	uint32_t	*value_maskp,
636310944Sarybchik	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
637310944Sarybchik	unsigned long	*valuesp,
638310944Sarybchik	__in			size_t count);
639310944Sarybchik
640310944Sarybchikextern				void
641310944Sarybchikef10_bist_stop(
642310944Sarybchik	__in			efx_nic_t *enp,
643310944Sarybchik	__in			efx_bist_type_t type);
644310944Sarybchik
645310944Sarybchik#endif	/* EFSYS_OPT_BIST */
646310944Sarybchik
647299720Sarybchik/* TX */
648299720Sarybchik
649299720Sarybchikextern	__checkReturn	efx_rc_t
650299720Sarybchikef10_tx_init(
651299720Sarybchik	__in		efx_nic_t *enp);
652299720Sarybchik
653299720Sarybchikextern			void
654299720Sarybchikef10_tx_fini(
655299720Sarybchik	__in		efx_nic_t *enp);
656299720Sarybchik
657299720Sarybchikextern	__checkReturn	efx_rc_t
658299720Sarybchikef10_tx_qcreate(
659299720Sarybchik	__in		efx_nic_t *enp,
660299720Sarybchik	__in		unsigned int index,
661299720Sarybchik	__in		unsigned int label,
662299720Sarybchik	__in		efsys_mem_t *esmp,
663299720Sarybchik	__in		size_t n,
664299720Sarybchik	__in		uint32_t id,
665299720Sarybchik	__in		uint16_t flags,
666299720Sarybchik	__in		efx_evq_t *eep,
667299720Sarybchik	__in		efx_txq_t *etp,
668299720Sarybchik	__out		unsigned int *addedp);
669299720Sarybchik
670299720Sarybchikextern		void
671299720Sarybchikef10_tx_qdestroy(
672299720Sarybchik	__in		efx_txq_t *etp);
673299720Sarybchik
674299720Sarybchikextern	__checkReturn	efx_rc_t
675299720Sarybchikef10_tx_qpost(
676299720Sarybchik	__in		efx_txq_t *etp,
677299720Sarybchik	__in_ecount(n)	efx_buffer_t *eb,
678299720Sarybchik	__in		unsigned int n,
679299720Sarybchik	__in		unsigned int completed,
680299720Sarybchik	__inout		unsigned int *addedp);
681299720Sarybchik
682299720Sarybchikextern			void
683299720Sarybchikef10_tx_qpush(
684299720Sarybchik	__in		efx_txq_t *etp,
685299720Sarybchik	__in		unsigned int added,
686299720Sarybchik	__in		unsigned int pushed);
687299720Sarybchik
688299720Sarybchikextern	__checkReturn	efx_rc_t
689299720Sarybchikef10_tx_qpace(
690299720Sarybchik	__in		efx_txq_t *etp,
691299720Sarybchik	__in		unsigned int ns);
692299720Sarybchik
693299720Sarybchikextern	__checkReturn	efx_rc_t
694299720Sarybchikef10_tx_qflush(
695299720Sarybchik	__in		efx_txq_t *etp);
696299720Sarybchik
697299720Sarybchikextern			void
698299720Sarybchikef10_tx_qenable(
699299720Sarybchik	__in		efx_txq_t *etp);
700299720Sarybchik
701299720Sarybchikextern	__checkReturn	efx_rc_t
702299720Sarybchikef10_tx_qpio_enable(
703299720Sarybchik	__in		efx_txq_t *etp);
704299720Sarybchik
705299720Sarybchikextern			void
706299720Sarybchikef10_tx_qpio_disable(
707299720Sarybchik	__in		efx_txq_t *etp);
708299720Sarybchik
709299720Sarybchikextern	__checkReturn	efx_rc_t
710299720Sarybchikef10_tx_qpio_write(
711299720Sarybchik	__in			efx_txq_t *etp,
712299720Sarybchik	__in_ecount(buf_length)	uint8_t *buffer,
713299720Sarybchik	__in			size_t buf_length,
714299720Sarybchik	__in			size_t pio_buf_offset);
715299720Sarybchik
716299720Sarybchikextern	__checkReturn	efx_rc_t
717299720Sarybchikef10_tx_qpio_post(
718299720Sarybchik	__in			efx_txq_t *etp,
719299720Sarybchik	__in			size_t pkt_length,
720299720Sarybchik	__in			unsigned int completed,
721299720Sarybchik	__inout			unsigned int *addedp);
722299720Sarybchik
723299720Sarybchikextern	__checkReturn	efx_rc_t
724299720Sarybchikef10_tx_qdesc_post(
725299720Sarybchik	__in		efx_txq_t *etp,
726299720Sarybchik	__in_ecount(n)	efx_desc_t *ed,
727299720Sarybchik	__in		unsigned int n,
728299720Sarybchik	__in		unsigned int completed,
729299720Sarybchik	__inout		unsigned int *addedp);
730299720Sarybchik
731299720Sarybchikextern	void
732299720Sarybchikef10_tx_qdesc_dma_create(
733299720Sarybchik	__in	efx_txq_t *etp,
734299720Sarybchik	__in	efsys_dma_addr_t addr,
735299720Sarybchik	__in	size_t size,
736299720Sarybchik	__in	boolean_t eop,
737299720Sarybchik	__out	efx_desc_t *edp);
738299720Sarybchik
739299720Sarybchikextern	void
740299720Sarybchikef10_tx_qdesc_tso_create(
741299720Sarybchik	__in	efx_txq_t *etp,
742299720Sarybchik	__in	uint16_t ipv4_id,
743299720Sarybchik	__in	uint32_t tcp_seq,
744299720Sarybchik	__in	uint8_t	 tcp_flags,
745299720Sarybchik	__out	efx_desc_t *edp);
746299720Sarybchik
747299720Sarybchikextern	void
748299720Sarybchikef10_tx_qdesc_tso2_create(
749299720Sarybchik	__in			efx_txq_t *etp,
750299720Sarybchik	__in			uint16_t ipv4_id,
751299720Sarybchik	__in			uint32_t tcp_seq,
752299720Sarybchik	__in			uint16_t tcp_mss,
753299720Sarybchik	__out_ecount(count)	efx_desc_t *edp,
754299720Sarybchik	__in			int count);
755299720Sarybchik
756299720Sarybchikextern	void
757299720Sarybchikef10_tx_qdesc_vlantci_create(
758299720Sarybchik	__in	efx_txq_t *etp,
759299720Sarybchik	__in	uint16_t vlan_tci,
760299720Sarybchik	__out	efx_desc_t *edp);
761299720Sarybchik
762342438Sarybchikextern	void
763342438Sarybchikef10_tx_qdesc_checksum_create(
764342438Sarybchik	__in	efx_txq_t *etp,
765342438Sarybchik	__in	uint16_t flags,
766342438Sarybchik	__out	efx_desc_t *edp);
767299720Sarybchik
768299720Sarybchik#if EFSYS_OPT_QSTATS
769299720Sarybchik
770299720Sarybchikextern			void
771299720Sarybchikef10_tx_qstats_update(
772299720Sarybchik	__in				efx_txq_t *etp,
773299720Sarybchik	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
774299720Sarybchik
775299720Sarybchik#endif /* EFSYS_OPT_QSTATS */
776299720Sarybchik
777299720Sarybchiktypedef uint32_t	efx_piobuf_handle_t;
778299720Sarybchik
779299720Sarybchik#define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
780299720Sarybchik
781299720Sarybchikextern	__checkReturn	efx_rc_t
782299720Sarybchikef10_nic_pio_alloc(
783299720Sarybchik	__inout		efx_nic_t *enp,
784299720Sarybchik	__out		uint32_t *bufnump,
785299720Sarybchik	__out		efx_piobuf_handle_t *handlep,
786299720Sarybchik	__out		uint32_t *blknump,
787299720Sarybchik	__out		uint32_t *offsetp,
788299720Sarybchik	__out		size_t *sizep);
789299720Sarybchik
790299720Sarybchikextern	__checkReturn	efx_rc_t
791299720Sarybchikef10_nic_pio_free(
792299720Sarybchik	__inout		efx_nic_t *enp,
793299720Sarybchik	__in		uint32_t bufnum,
794299720Sarybchik	__in		uint32_t blknum);
795299720Sarybchik
796299720Sarybchikextern	__checkReturn	efx_rc_t
797299720Sarybchikef10_nic_pio_link(
798299720Sarybchik	__inout		efx_nic_t *enp,
799299720Sarybchik	__in		uint32_t vi_index,
800299720Sarybchik	__in		efx_piobuf_handle_t handle);
801299720Sarybchik
802299720Sarybchikextern	__checkReturn	efx_rc_t
803299720Sarybchikef10_nic_pio_unlink(
804299720Sarybchik	__inout		efx_nic_t *enp,
805299720Sarybchik	__in		uint32_t vi_index);
806299720Sarybchik
807299720Sarybchik
808299720Sarybchik/* VPD */
809299720Sarybchik
810299720Sarybchik#if EFSYS_OPT_VPD
811299720Sarybchik
812299720Sarybchikextern	__checkReturn		efx_rc_t
813299720Sarybchikef10_vpd_init(
814299720Sarybchik	__in			efx_nic_t *enp);
815299720Sarybchik
816299720Sarybchikextern	__checkReturn		efx_rc_t
817299720Sarybchikef10_vpd_size(
818299720Sarybchik	__in			efx_nic_t *enp,
819299720Sarybchik	__out			size_t *sizep);
820299720Sarybchik
821299720Sarybchikextern	__checkReturn		efx_rc_t
822299720Sarybchikef10_vpd_read(
823299720Sarybchik	__in			efx_nic_t *enp,
824299720Sarybchik	__out_bcount(size)	caddr_t data,
825299720Sarybchik	__in			size_t size);
826299720Sarybchik
827299720Sarybchikextern	__checkReturn		efx_rc_t
828299720Sarybchikef10_vpd_verify(
829299720Sarybchik	__in			efx_nic_t *enp,
830299720Sarybchik	__in_bcount(size)	caddr_t data,
831299720Sarybchik	__in			size_t size);
832299720Sarybchik
833299720Sarybchikextern	__checkReturn		efx_rc_t
834299720Sarybchikef10_vpd_reinit(
835299720Sarybchik	__in			efx_nic_t *enp,
836299720Sarybchik	__in_bcount(size)	caddr_t data,
837299720Sarybchik	__in			size_t size);
838299720Sarybchik
839299720Sarybchikextern	__checkReturn		efx_rc_t
840299720Sarybchikef10_vpd_get(
841299720Sarybchik	__in			efx_nic_t *enp,
842299720Sarybchik	__in_bcount(size)	caddr_t data,
843299720Sarybchik	__in			size_t size,
844299720Sarybchik	__inout			efx_vpd_value_t *evvp);
845299720Sarybchik
846299720Sarybchikextern	__checkReturn		efx_rc_t
847299720Sarybchikef10_vpd_set(
848299720Sarybchik	__in			efx_nic_t *enp,
849299720Sarybchik	__in_bcount(size)	caddr_t data,
850299720Sarybchik	__in			size_t size,
851299720Sarybchik	__in			efx_vpd_value_t *evvp);
852299720Sarybchik
853299720Sarybchikextern	__checkReturn		efx_rc_t
854299720Sarybchikef10_vpd_next(
855299720Sarybchik	__in			efx_nic_t *enp,
856299720Sarybchik	__in_bcount(size)	caddr_t data,
857299720Sarybchik	__in			size_t size,
858299720Sarybchik	__out			efx_vpd_value_t *evvp,
859299720Sarybchik	__inout			unsigned int *contp);
860299720Sarybchik
861299720Sarybchikextern __checkReturn		efx_rc_t
862299720Sarybchikef10_vpd_write(
863299720Sarybchik	__in			efx_nic_t *enp,
864299720Sarybchik	__in_bcount(size)	caddr_t data,
865299720Sarybchik	__in			size_t size);
866299720Sarybchik
867299720Sarybchikextern				void
868299720Sarybchikef10_vpd_fini(
869299720Sarybchik	__in			efx_nic_t *enp);
870299720Sarybchik
871299720Sarybchik#endif	/* EFSYS_OPT_VPD */
872299720Sarybchik
873299720Sarybchik
874299720Sarybchik/* RX */
875299720Sarybchik
876299720Sarybchikextern	__checkReturn	efx_rc_t
877299720Sarybchikef10_rx_init(
878299720Sarybchik	__in		efx_nic_t *enp);
879299720Sarybchik
880299720Sarybchik#if EFSYS_OPT_RX_SCATTER
881299720Sarybchikextern	__checkReturn	efx_rc_t
882299720Sarybchikef10_rx_scatter_enable(
883299720Sarybchik	__in		efx_nic_t *enp,
884299720Sarybchik	__in		unsigned int buf_size);
885299720Sarybchik#endif	/* EFSYS_OPT_RX_SCATTER */
886299720Sarybchik
887299720Sarybchik
888299720Sarybchik#if EFSYS_OPT_RX_SCALE
889299720Sarybchik
890299720Sarybchikextern	__checkReturn	efx_rc_t
891299720Sarybchikef10_rx_scale_mode_set(
892299720Sarybchik	__in		efx_nic_t *enp,
893299720Sarybchik	__in		efx_rx_hash_alg_t alg,
894299720Sarybchik	__in		efx_rx_hash_type_t type,
895299720Sarybchik	__in		boolean_t insert);
896299720Sarybchik
897299720Sarybchikextern	__checkReturn	efx_rc_t
898299720Sarybchikef10_rx_scale_key_set(
899299720Sarybchik	__in		efx_nic_t *enp,
900299720Sarybchik	__in_ecount(n)	uint8_t *key,
901299720Sarybchik	__in		size_t n);
902299720Sarybchik
903299720Sarybchikextern	__checkReturn	efx_rc_t
904299720Sarybchikef10_rx_scale_tbl_set(
905299720Sarybchik	__in		efx_nic_t *enp,
906299720Sarybchik	__in_ecount(n)	unsigned int *table,
907299720Sarybchik	__in		size_t n);
908299720Sarybchik
909299720Sarybchikextern	__checkReturn	uint32_t
910299720Sarybchikef10_rx_prefix_hash(
911299720Sarybchik	__in		efx_nic_t *enp,
912299720Sarybchik	__in		efx_rx_hash_alg_t func,
913299720Sarybchik	__in		uint8_t *buffer);
914299720Sarybchik
915299720Sarybchik#endif /* EFSYS_OPT_RX_SCALE */
916299720Sarybchik
917299720Sarybchikextern	__checkReturn	efx_rc_t
918299720Sarybchikef10_rx_prefix_pktlen(
919299720Sarybchik	__in		efx_nic_t *enp,
920299720Sarybchik	__in		uint8_t *buffer,
921299720Sarybchik	__out		uint16_t *lengthp);
922299720Sarybchik
923299720Sarybchikextern			void
924299720Sarybchikef10_rx_qpost(
925299720Sarybchik	__in		efx_rxq_t *erp,
926299720Sarybchik	__in_ecount(n)	efsys_dma_addr_t *addrp,
927299720Sarybchik	__in		size_t size,
928299720Sarybchik	__in		unsigned int n,
929299720Sarybchik	__in		unsigned int completed,
930299720Sarybchik	__in		unsigned int added);
931299720Sarybchik
932299720Sarybchikextern			void
933299720Sarybchikef10_rx_qpush(
934299720Sarybchik	__in		efx_rxq_t *erp,
935299720Sarybchik	__in		unsigned int added,
936299720Sarybchik	__inout		unsigned int *pushedp);
937299720Sarybchik
938299720Sarybchikextern	__checkReturn	efx_rc_t
939299720Sarybchikef10_rx_qflush(
940299720Sarybchik	__in		efx_rxq_t *erp);
941299720Sarybchik
942299720Sarybchikextern		void
943299720Sarybchikef10_rx_qenable(
944299720Sarybchik	__in		efx_rxq_t *erp);
945299720Sarybchik
946299720Sarybchikextern	__checkReturn	efx_rc_t
947299720Sarybchikef10_rx_qcreate(
948299720Sarybchik	__in		efx_nic_t *enp,
949299720Sarybchik	__in		unsigned int index,
950299720Sarybchik	__in		unsigned int label,
951299720Sarybchik	__in		efx_rxq_type_t type,
952299720Sarybchik	__in		efsys_mem_t *esmp,
953299720Sarybchik	__in		size_t n,
954299720Sarybchik	__in		uint32_t id,
955299720Sarybchik	__in		efx_evq_t *eep,
956299720Sarybchik	__in		efx_rxq_t *erp);
957299720Sarybchik
958299720Sarybchikextern			void
959299720Sarybchikef10_rx_qdestroy(
960299720Sarybchik	__in		efx_rxq_t *erp);
961299720Sarybchik
962299720Sarybchikextern			void
963299720Sarybchikef10_rx_fini(
964299720Sarybchik	__in		efx_nic_t *enp);
965299720Sarybchik
966299720Sarybchik#if EFSYS_OPT_FILTER
967299720Sarybchik
968299720Sarybchiktypedef struct ef10_filter_handle_s {
969299720Sarybchik	uint32_t	efh_lo;
970299720Sarybchik	uint32_t	efh_hi;
971299720Sarybchik} ef10_filter_handle_t;
972299720Sarybchik
973299720Sarybchiktypedef struct ef10_filter_entry_s {
974299720Sarybchik	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
975299720Sarybchik	ef10_filter_handle_t efe_handle;
976299720Sarybchik} ef10_filter_entry_t;
977299720Sarybchik
978299720Sarybchik/*
979299720Sarybchik * BUSY flag indicates that an update is in progress.
980299720Sarybchik * AUTO_OLD flag is used to mark and sweep MAC packet filters.
981299720Sarybchik */
982299720Sarybchik#define	EFX_EF10_FILTER_FLAG_BUSY	1U
983299720Sarybchik#define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
984299720Sarybchik#define	EFX_EF10_FILTER_FLAGS		3U
985299720Sarybchik
986299720Sarybchik/*
987299720Sarybchik * Size of the hash table used by the driver. Doesn't need to be the
988299720Sarybchik * same size as the hardware's table.
989299720Sarybchik */
990299720Sarybchik#define	EFX_EF10_FILTER_TBL_ROWS 8192
991299720Sarybchik
992299720Sarybchik/* Only need to allow for one directed and one unknown unicast filter */
993299720Sarybchik#define	EFX_EF10_FILTER_UNICAST_FILTERS_MAX	2
994299720Sarybchik
995299720Sarybchik/* Allow for the broadcast address to be added to the multicast list */
996299720Sarybchik#define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
997299720Sarybchik
998342416Sarybchik/*
999342416Sarybchik * For encapsulated packets, there is one filter each for each combination of
1000342416Sarybchik * IPv4 or IPv6 outer frame, VXLAN, GENEVE or NVGRE packet type, and unicast or
1001342416Sarybchik * multicast inner frames.
1002342416Sarybchik */
1003342416Sarybchik#define EFX_EF10_FILTER_ENCAP_FILTERS_MAX	12
1004342416Sarybchik
1005299720Sarybchiktypedef struct ef10_filter_table_s {
1006299720Sarybchik	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
1007310917Sarybchik	efx_rxq_t		*eft_default_rxq;
1008299720Sarybchik	boolean_t		eft_using_rss;
1009299720Sarybchik	uint32_t		eft_unicst_filter_indexes[
1010299720Sarybchik	    EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
1011310938Sarybchik	uint32_t		eft_unicst_filter_count;
1012299720Sarybchik	uint32_t		eft_mulcst_filter_indexes[
1013299720Sarybchik	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
1014299720Sarybchik	uint32_t		eft_mulcst_filter_count;
1015299720Sarybchik	boolean_t		eft_using_all_mulcst;
1016342416Sarybchik	uint32_t		eft_encap_filter_indexes[
1017342416Sarybchik	    EFX_EF10_FILTER_ENCAP_FILTERS_MAX];
1018342416Sarybchik	uint32_t		eft_encap_filter_count;
1019299720Sarybchik} ef10_filter_table_t;
1020299720Sarybchik
1021299720Sarybchik	__checkReturn	efx_rc_t
1022299720Sarybchikef10_filter_init(
1023299720Sarybchik	__in		efx_nic_t *enp);
1024299720Sarybchik
1025299720Sarybchik			void
1026299720Sarybchikef10_filter_fini(
1027299720Sarybchik	__in		efx_nic_t *enp);
1028299720Sarybchik
1029299720Sarybchik	__checkReturn	efx_rc_t
1030299720Sarybchikef10_filter_restore(
1031299720Sarybchik	__in		efx_nic_t *enp);
1032299720Sarybchik
1033299720Sarybchik	__checkReturn	efx_rc_t
1034299720Sarybchikef10_filter_add(
1035299720Sarybchik	__in		efx_nic_t *enp,
1036299720Sarybchik	__inout		efx_filter_spec_t *spec,
1037299720Sarybchik	__in		boolean_t may_replace);
1038299720Sarybchik
1039299720Sarybchik	__checkReturn	efx_rc_t
1040299720Sarybchikef10_filter_delete(
1041299720Sarybchik	__in		efx_nic_t *enp,
1042299720Sarybchik	__inout		efx_filter_spec_t *spec);
1043299720Sarybchik
1044299720Sarybchikextern	__checkReturn	efx_rc_t
1045299720Sarybchikef10_filter_supported_filters(
1046311485Sarybchik	__in				efx_nic_t *enp,
1047311485Sarybchik	__out_ecount(buffer_length)	uint32_t *buffer,
1048311485Sarybchik	__in				size_t buffer_length,
1049311485Sarybchik	__out				size_t *list_lengthp);
1050299720Sarybchik
1051299720Sarybchikextern	__checkReturn	efx_rc_t
1052299720Sarybchikef10_filter_reconfigure(
1053299720Sarybchik	__in				efx_nic_t *enp,
1054299720Sarybchik	__in_ecount(6)			uint8_t const *mac_addr,
1055299720Sarybchik	__in				boolean_t all_unicst,
1056299720Sarybchik	__in				boolean_t mulcst,
1057299720Sarybchik	__in				boolean_t all_mulcst,
1058299720Sarybchik	__in				boolean_t brdcst,
1059299720Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
1060299720Sarybchik	__in				uint32_t count);
1061299720Sarybchik
1062299720Sarybchikextern		void
1063299720Sarybchikef10_filter_get_default_rxq(
1064299720Sarybchik	__in		efx_nic_t *enp,
1065299720Sarybchik	__out		efx_rxq_t **erpp,
1066299720Sarybchik	__out		boolean_t *using_rss);
1067299720Sarybchik
1068299720Sarybchikextern		void
1069299720Sarybchikef10_filter_default_rxq_set(
1070299720Sarybchik	__in		efx_nic_t *enp,
1071299720Sarybchik	__in		efx_rxq_t *erp,
1072299720Sarybchik	__in		boolean_t using_rss);
1073299720Sarybchik
1074299720Sarybchikextern		void
1075299720Sarybchikef10_filter_default_rxq_clear(
1076299720Sarybchik	__in		efx_nic_t *enp);
1077299720Sarybchik
1078299720Sarybchik
1079299720Sarybchik#endif /* EFSYS_OPT_FILTER */
1080299720Sarybchik
1081299720Sarybchikextern	__checkReturn			efx_rc_t
1082299720Sarybchikefx_mcdi_get_function_info(
1083299720Sarybchik	__in				efx_nic_t *enp,
1084299720Sarybchik	__out				uint32_t *pfp,
1085299720Sarybchik	__out_opt			uint32_t *vfp);
1086299720Sarybchik
1087299720Sarybchikextern	__checkReturn		efx_rc_t
1088299720Sarybchikefx_mcdi_privilege_mask(
1089299720Sarybchik	__in			efx_nic_t *enp,
1090299720Sarybchik	__in			uint32_t pf,
1091299720Sarybchik	__in			uint32_t vf,
1092299720Sarybchik	__out			uint32_t *maskp);
1093299720Sarybchik
1094299720Sarybchikextern	__checkReturn	efx_rc_t
1095293887Sarybchikefx_mcdi_get_port_assignment(
1096293887Sarybchik	__in		efx_nic_t *enp,
1097293887Sarybchik	__out		uint32_t *portp);
1098293734Sarybchik
1099293887Sarybchikextern	__checkReturn	efx_rc_t
1100293887Sarybchikefx_mcdi_get_port_modes(
1101293887Sarybchik	__in		efx_nic_t *enp,
1102299904Sarybchik	__out		uint32_t *modesp,
1103299904Sarybchik	__out_opt	uint32_t *current_modep);
1104293734Sarybchik
1105293887Sarybchikextern	__checkReturn	efx_rc_t
1106299904Sarybchikef10_nic_get_port_mode_bandwidth(
1107299904Sarybchik	__in		uint32_t port_mode,
1108299904Sarybchik	__out		uint32_t *bandwidth_mbpsp);
1109299904Sarybchik
1110299904Sarybchikextern	__checkReturn	efx_rc_t
1111293887Sarybchikefx_mcdi_get_mac_address_pf(
1112293887Sarybchik	__in			efx_nic_t *enp,
1113293887Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1114293887Sarybchik
1115293887Sarybchikextern	__checkReturn	efx_rc_t
1116293887Sarybchikefx_mcdi_get_mac_address_vf(
1117293887Sarybchik	__in			efx_nic_t *enp,
1118293887Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1119293887Sarybchik
1120293887Sarybchikextern	__checkReturn	efx_rc_t
1121293887Sarybchikefx_mcdi_get_clock(
1122293887Sarybchik	__in		efx_nic_t *enp,
1123300009Sarybchik	__out		uint32_t *sys_freqp,
1124300009Sarybchik	__out		uint32_t *dpcpu_freqp);
1125293887Sarybchik
1126300009Sarybchik
1127293887Sarybchikextern	__checkReturn	efx_rc_t
1128293887Sarybchikefx_mcdi_get_vector_cfg(
1129293887Sarybchik	__in		efx_nic_t *enp,
1130293887Sarybchik	__out_opt	uint32_t *vec_basep,
1131293887Sarybchik	__out_opt	uint32_t *pf_nvecp,
1132293887Sarybchik	__out_opt	uint32_t *vf_nvecp);
1133293887Sarybchik
1134293887Sarybchikextern	__checkReturn	efx_rc_t
1135293887Sarybchikef10_get_datapath_caps(
1136293887Sarybchik	__in		efx_nic_t *enp);
1137293887Sarybchik
1138294079Sarybchikextern	__checkReturn		efx_rc_t
1139294079Sarybchikef10_get_privilege_mask(
1140294079Sarybchik	__in			efx_nic_t *enp,
1141294079Sarybchik	__out			uint32_t *maskp);
1142294079Sarybchik
1143293887Sarybchikextern	__checkReturn	efx_rc_t
1144293887Sarybchikef10_external_port_mapping(
1145293887Sarybchik	__in		efx_nic_t *enp,
1146293887Sarybchik	__in		uint32_t port,
1147293887Sarybchik	__out		uint8_t *external_portp);
1148293887Sarybchik
1149293887Sarybchik
1150293734Sarybchik#ifdef	__cplusplus
1151293734Sarybchik}
1152293734Sarybchik#endif
1153293734Sarybchik
1154293734Sarybchik#endif	/* _SYS_EF10_IMPL_H */
1155