ef10_impl.h revision 310917
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 310917 2016-12-31 10:59:22Z 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,
88299720Sarybchik	__in		efx_evq_t *eep);
89299720Sarybchik
90299720Sarybchik			void
91299720Sarybchikef10_ev_qdestroy(
92299720Sarybchik	__in		efx_evq_t *eep);
93299720Sarybchik
94299720Sarybchik	__checkReturn	efx_rc_t
95299720Sarybchikef10_ev_qprime(
96299720Sarybchik	__in		efx_evq_t *eep,
97299720Sarybchik	__in		unsigned int count);
98299720Sarybchik
99299720Sarybchik			void
100299720Sarybchikef10_ev_qpost(
101299720Sarybchik	__in	efx_evq_t *eep,
102299720Sarybchik	__in	uint16_t data);
103299720Sarybchik
104299720Sarybchik	__checkReturn	efx_rc_t
105299720Sarybchikef10_ev_qmoderate(
106299720Sarybchik	__in		efx_evq_t *eep,
107299720Sarybchik	__in		unsigned int us);
108299720Sarybchik
109299720Sarybchik#if EFSYS_OPT_QSTATS
110299720Sarybchik			void
111299720Sarybchikef10_ev_qstats_update(
112299720Sarybchik	__in				efx_evq_t *eep,
113299720Sarybchik	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
114299720Sarybchik#endif /* EFSYS_OPT_QSTATS */
115299720Sarybchik
116299720Sarybchik		void
117299720Sarybchikef10_ev_rxlabel_init(
118299720Sarybchik	__in		efx_evq_t *eep,
119299720Sarybchik	__in		efx_rxq_t *erp,
120299720Sarybchik	__in		unsigned int label);
121299720Sarybchik
122299720Sarybchik		void
123299720Sarybchikef10_ev_rxlabel_fini(
124299720Sarybchik	__in		efx_evq_t *eep,
125299720Sarybchik	__in		unsigned int label);
126299720Sarybchik
127299720Sarybchik/* INTR */
128299720Sarybchik
129299720Sarybchik	__checkReturn	efx_rc_t
130299720Sarybchikef10_intr_init(
131299720Sarybchik	__in		efx_nic_t *enp,
132299720Sarybchik	__in		efx_intr_type_t type,
133299720Sarybchik	__in		efsys_mem_t *esmp);
134299720Sarybchik
135299720Sarybchik			void
136299720Sarybchikef10_intr_enable(
137299720Sarybchik	__in		efx_nic_t *enp);
138299720Sarybchik
139299720Sarybchik			void
140299720Sarybchikef10_intr_disable(
141299720Sarybchik	__in		efx_nic_t *enp);
142299720Sarybchik
143299720Sarybchik			void
144299720Sarybchikef10_intr_disable_unlocked(
145299720Sarybchik	__in		efx_nic_t *enp);
146299720Sarybchik
147299720Sarybchik	__checkReturn	efx_rc_t
148299720Sarybchikef10_intr_trigger(
149299720Sarybchik	__in		efx_nic_t *enp,
150299720Sarybchik	__in		unsigned int level);
151299720Sarybchik
152299720Sarybchik			void
153299720Sarybchikef10_intr_status_line(
154299720Sarybchik	__in		efx_nic_t *enp,
155299720Sarybchik	__out		boolean_t *fatalp,
156299720Sarybchik	__out		uint32_t *qmaskp);
157299720Sarybchik
158299720Sarybchik			void
159299720Sarybchikef10_intr_status_message(
160299720Sarybchik	__in		efx_nic_t *enp,
161299720Sarybchik	__in		unsigned int message,
162299720Sarybchik	__out		boolean_t *fatalp);
163299720Sarybchik
164299720Sarybchik			void
165299720Sarybchikef10_intr_fatal(
166299720Sarybchik	__in		efx_nic_t *enp);
167299720Sarybchik			void
168299720Sarybchikef10_intr_fini(
169299720Sarybchik	__in		efx_nic_t *enp);
170299720Sarybchik
171299720Sarybchik/* NIC */
172299720Sarybchik
173293887Sarybchikextern	__checkReturn	efx_rc_t
174299720Sarybchikef10_nic_probe(
175299720Sarybchik	__in		efx_nic_t *enp);
176299720Sarybchik
177299720Sarybchikextern	__checkReturn	efx_rc_t
178299720Sarybchikef10_nic_set_drv_limits(
179299720Sarybchik	__inout		efx_nic_t *enp,
180299720Sarybchik	__in		efx_drv_limits_t *edlp);
181299720Sarybchik
182299720Sarybchikextern	__checkReturn	efx_rc_t
183299720Sarybchikef10_nic_get_vi_pool(
184299720Sarybchik	__in		efx_nic_t *enp,
185299720Sarybchik	__out		uint32_t *vi_countp);
186299720Sarybchik
187299720Sarybchikextern	__checkReturn	efx_rc_t
188299720Sarybchikef10_nic_get_bar_region(
189299720Sarybchik	__in		efx_nic_t *enp,
190299720Sarybchik	__in		efx_nic_region_t region,
191299720Sarybchik	__out		uint32_t *offsetp,
192299720Sarybchik	__out		size_t *sizep);
193299720Sarybchik
194299720Sarybchikextern	__checkReturn	efx_rc_t
195299720Sarybchikef10_nic_reset(
196299720Sarybchik	__in		efx_nic_t *enp);
197299720Sarybchik
198299720Sarybchikextern	__checkReturn	efx_rc_t
199299720Sarybchikef10_nic_init(
200299720Sarybchik	__in		efx_nic_t *enp);
201299720Sarybchik
202299720Sarybchik#if EFSYS_OPT_DIAG
203299720Sarybchik
204299720Sarybchikextern	__checkReturn	efx_rc_t
205299720Sarybchikef10_nic_register_test(
206299720Sarybchik	__in		efx_nic_t *enp);
207299720Sarybchik
208299720Sarybchik#endif	/* EFSYS_OPT_DIAG */
209299720Sarybchik
210299720Sarybchikextern			void
211299720Sarybchikef10_nic_fini(
212299720Sarybchik	__in		efx_nic_t *enp);
213299720Sarybchik
214299720Sarybchikextern			void
215299720Sarybchikef10_nic_unprobe(
216299720Sarybchik	__in		efx_nic_t *enp);
217299720Sarybchik
218299720Sarybchik
219299720Sarybchik/* MAC */
220299720Sarybchik
221299720Sarybchikextern	__checkReturn	efx_rc_t
222299720Sarybchikef10_mac_poll(
223299720Sarybchik	__in		efx_nic_t *enp,
224299720Sarybchik	__out		efx_link_mode_t *link_modep);
225299720Sarybchik
226299720Sarybchikextern	__checkReturn	efx_rc_t
227299720Sarybchikef10_mac_up(
228299720Sarybchik	__in		efx_nic_t *enp,
229299720Sarybchik	__out		boolean_t *mac_upp);
230299720Sarybchik
231299720Sarybchikextern	__checkReturn	efx_rc_t
232299720Sarybchikef10_mac_addr_set(
233299720Sarybchik	__in	efx_nic_t *enp);
234299720Sarybchik
235299720Sarybchikextern	__checkReturn	efx_rc_t
236299720Sarybchikef10_mac_pdu_set(
237299720Sarybchik	__in	efx_nic_t *enp);
238299720Sarybchik
239299720Sarybchikextern	__checkReturn	efx_rc_t
240300008Sarybchikef10_mac_pdu_get(
241300008Sarybchik	__in	efx_nic_t *enp,
242300008Sarybchik	__out	size_t *pdu);
243300008Sarybchik
244300008Sarybchikextern	__checkReturn	efx_rc_t
245299720Sarybchikef10_mac_reconfigure(
246299720Sarybchik	__in	efx_nic_t *enp);
247299720Sarybchik
248299720Sarybchikextern	__checkReturn	efx_rc_t
249299720Sarybchikef10_mac_multicast_list_set(
250299720Sarybchik	__in				efx_nic_t *enp);
251299720Sarybchik
252299720Sarybchikextern	__checkReturn	efx_rc_t
253299720Sarybchikef10_mac_filter_default_rxq_set(
254299720Sarybchik	__in		efx_nic_t *enp,
255299720Sarybchik	__in		efx_rxq_t *erp,
256299720Sarybchik	__in		boolean_t using_rss);
257299720Sarybchik
258299720Sarybchikextern			void
259299720Sarybchikef10_mac_filter_default_rxq_clear(
260299720Sarybchik	__in		efx_nic_t *enp);
261299720Sarybchik
262299720Sarybchik#if EFSYS_OPT_LOOPBACK
263299720Sarybchik
264299720Sarybchikextern	__checkReturn	efx_rc_t
265299720Sarybchikef10_mac_loopback_set(
266299720Sarybchik	__in		efx_nic_t *enp,
267299720Sarybchik	__in		efx_link_mode_t link_mode,
268299720Sarybchik	__in		efx_loopback_type_t loopback_type);
269299720Sarybchik
270299720Sarybchik#endif	/* EFSYS_OPT_LOOPBACK */
271299720Sarybchik
272299720Sarybchik#if EFSYS_OPT_MAC_STATS
273299720Sarybchik
274299720Sarybchikextern	__checkReturn			efx_rc_t
275299720Sarybchikef10_mac_stats_update(
276299720Sarybchik	__in				efx_nic_t *enp,
277299720Sarybchik	__in				efsys_mem_t *esmp,
278299720Sarybchik	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
279299720Sarybchik	__inout_opt			uint32_t *generationp);
280299720Sarybchik
281299720Sarybchik#endif	/* EFSYS_OPT_MAC_STATS */
282299720Sarybchik
283299720Sarybchik
284299720Sarybchik/* MCDI */
285299720Sarybchik
286299720Sarybchik#if EFSYS_OPT_MCDI
287299720Sarybchik
288299720Sarybchikextern	__checkReturn	efx_rc_t
289299720Sarybchikef10_mcdi_init(
290299720Sarybchik	__in		efx_nic_t *enp,
291299720Sarybchik	__in		const efx_mcdi_transport_t *mtp);
292299720Sarybchik
293299720Sarybchikextern			void
294299720Sarybchikef10_mcdi_fini(
295299720Sarybchik	__in		efx_nic_t *enp);
296299720Sarybchik
297299720Sarybchikextern			void
298299720Sarybchikef10_mcdi_send_request(
299299720Sarybchik	__in		efx_nic_t *enp,
300299720Sarybchik	__in		void *hdrp,
301299720Sarybchik	__in		size_t hdr_len,
302299720Sarybchik	__in		void *sdup,
303299720Sarybchik	__in		size_t sdu_len);
304299720Sarybchik
305299720Sarybchikextern	__checkReturn	boolean_t
306299720Sarybchikef10_mcdi_poll_response(
307299720Sarybchik	__in		efx_nic_t *enp);
308299720Sarybchik
309299720Sarybchikextern			void
310299720Sarybchikef10_mcdi_read_response(
311299720Sarybchik	__in			efx_nic_t *enp,
312299720Sarybchik	__out_bcount(length)	void *bufferp,
313299720Sarybchik	__in			size_t offset,
314299720Sarybchik	__in			size_t length);
315299720Sarybchik
316299720Sarybchikextern			efx_rc_t
317299720Sarybchikef10_mcdi_poll_reboot(
318299720Sarybchik	__in		efx_nic_t *enp);
319299720Sarybchik
320299720Sarybchikextern	__checkReturn	efx_rc_t
321299720Sarybchikef10_mcdi_feature_supported(
322299720Sarybchik	__in		efx_nic_t *enp,
323299720Sarybchik	__in		efx_mcdi_feature_id_t id,
324299720Sarybchik	__out		boolean_t *supportedp);
325299720Sarybchik
326299720Sarybchik#endif /* EFSYS_OPT_MCDI */
327299720Sarybchik
328299720Sarybchik/* NVRAM */
329299720Sarybchik
330299720Sarybchik#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
331299720Sarybchik
332299720Sarybchikextern	__checkReturn		efx_rc_t
333299720Sarybchikef10_nvram_buf_read_tlv(
334299720Sarybchik	__in				efx_nic_t *enp,
335299720Sarybchik	__in_bcount(max_seg_size)	caddr_t seg_data,
336299720Sarybchik	__in				size_t max_seg_size,
337299720Sarybchik	__in				uint32_t tag,
338299720Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
339299720Sarybchik	__out				size_t *sizep);
340299720Sarybchik
341299720Sarybchikextern	__checkReturn		efx_rc_t
342299720Sarybchikef10_nvram_buf_write_tlv(
343299720Sarybchik	__inout_bcount(partn_size)	caddr_t partn_data,
344299720Sarybchik	__in				size_t partn_size,
345299720Sarybchik	__in				uint32_t tag,
346299720Sarybchik	__in_bcount(tag_size)		caddr_t tag_data,
347299720Sarybchik	__in				size_t tag_size,
348299720Sarybchik	__out				size_t *total_lengthp);
349299720Sarybchik
350299720Sarybchikextern	__checkReturn		efx_rc_t
351299720Sarybchikef10_nvram_partn_read_tlv(
352299720Sarybchik	__in				efx_nic_t *enp,
353299720Sarybchik	__in				uint32_t partn,
354299720Sarybchik	__in				uint32_t tag,
355299720Sarybchik	__deref_out_bcount_opt(*sizep)	caddr_t *datap,
356299720Sarybchik	__out				size_t *sizep);
357299720Sarybchik
358299720Sarybchikextern	__checkReturn		efx_rc_t
359299720Sarybchikef10_nvram_partn_write_tlv(
360299720Sarybchik	__in			efx_nic_t *enp,
361299720Sarybchik	__in			uint32_t partn,
362299720Sarybchik	__in			uint32_t tag,
363299720Sarybchik	__in_bcount(size)	caddr_t data,
364299720Sarybchik	__in			size_t size);
365299720Sarybchik
366299720Sarybchikextern	__checkReturn		efx_rc_t
367299720Sarybchikef10_nvram_partn_write_segment_tlv(
368299720Sarybchik	__in			efx_nic_t *enp,
369299720Sarybchik	__in			uint32_t partn,
370299720Sarybchik	__in			uint32_t tag,
371299720Sarybchik	__in_bcount(size)	caddr_t data,
372299720Sarybchik	__in			size_t size,
373299720Sarybchik	__in			boolean_t all_segments);
374299720Sarybchik
375299720Sarybchikextern	__checkReturn		efx_rc_t
376299720Sarybchikef10_nvram_partn_lock(
377299720Sarybchik	__in			efx_nic_t *enp,
378299720Sarybchik	__in			uint32_t partn);
379299720Sarybchik
380299720Sarybchikextern				void
381299720Sarybchikef10_nvram_partn_unlock(
382299720Sarybchik	__in			efx_nic_t *enp,
383299720Sarybchik	__in			uint32_t partn);
384299720Sarybchik
385299720Sarybchik#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
386299720Sarybchik
387299720Sarybchik#if EFSYS_OPT_NVRAM
388299720Sarybchik
389299720Sarybchik#if EFSYS_OPT_DIAG
390299720Sarybchik
391299720Sarybchikextern	__checkReturn		efx_rc_t
392299720Sarybchikef10_nvram_test(
393299720Sarybchik	__in			efx_nic_t *enp);
394299720Sarybchik
395299720Sarybchik#endif	/* EFSYS_OPT_DIAG */
396299720Sarybchik
397299720Sarybchikextern	__checkReturn		efx_rc_t
398299720Sarybchikef10_nvram_type_to_partn(
399299720Sarybchik	__in			efx_nic_t *enp,
400299720Sarybchik	__in			efx_nvram_type_t type,
401299720Sarybchik	__out			uint32_t *partnp);
402299720Sarybchik
403299720Sarybchikextern	__checkReturn		efx_rc_t
404299720Sarybchikef10_nvram_partn_size(
405299720Sarybchik	__in			efx_nic_t *enp,
406299720Sarybchik	__in			uint32_t partn,
407299720Sarybchik	__out			size_t *sizep);
408299720Sarybchik
409299720Sarybchikextern	__checkReturn		efx_rc_t
410299720Sarybchikef10_nvram_partn_rw_start(
411299720Sarybchik	__in			efx_nic_t *enp,
412299720Sarybchik	__in			uint32_t partn,
413299720Sarybchik	__out			size_t *chunk_sizep);
414299720Sarybchik
415299720Sarybchikextern	__checkReturn		efx_rc_t
416299720Sarybchikef10_nvram_partn_read_mode(
417299720Sarybchik	__in			efx_nic_t *enp,
418299720Sarybchik	__in			uint32_t partn,
419299720Sarybchik	__in			unsigned int offset,
420299720Sarybchik	__out_bcount(size)	caddr_t data,
421299720Sarybchik	__in			size_t size,
422299720Sarybchik	__in			uint32_t mode);
423299720Sarybchik
424299720Sarybchikextern	__checkReturn		efx_rc_t
425299720Sarybchikef10_nvram_partn_read(
426299720Sarybchik	__in			efx_nic_t *enp,
427299720Sarybchik	__in			uint32_t partn,
428299720Sarybchik	__in			unsigned int offset,
429299720Sarybchik	__out_bcount(size)	caddr_t data,
430299720Sarybchik	__in			size_t size);
431299720Sarybchik
432299720Sarybchikextern	__checkReturn		efx_rc_t
433299720Sarybchikef10_nvram_partn_erase(
434299720Sarybchik	__in			efx_nic_t *enp,
435299720Sarybchik	__in			uint32_t partn,
436299720Sarybchik	__in			unsigned int offset,
437299720Sarybchik	__in			size_t size);
438299720Sarybchik
439299720Sarybchikextern	__checkReturn		efx_rc_t
440299720Sarybchikef10_nvram_partn_write(
441299720Sarybchik	__in			efx_nic_t *enp,
442299720Sarybchik	__in			uint32_t partn,
443299720Sarybchik	__in			unsigned int offset,
444299720Sarybchik	__out_bcount(size)	caddr_t data,
445299720Sarybchik	__in			size_t size);
446299720Sarybchik
447299720Sarybchikextern				void
448299720Sarybchikef10_nvram_partn_rw_finish(
449299720Sarybchik	__in			efx_nic_t *enp,
450299720Sarybchik	__in			uint32_t partn);
451299720Sarybchik
452299720Sarybchikextern	__checkReturn		efx_rc_t
453299720Sarybchikef10_nvram_partn_get_version(
454299720Sarybchik	__in			efx_nic_t *enp,
455299720Sarybchik	__in			uint32_t partn,
456299720Sarybchik	__out			uint32_t *subtypep,
457299720Sarybchik	__out_ecount(4)		uint16_t version[4]);
458299720Sarybchik
459299720Sarybchikextern	__checkReturn		efx_rc_t
460299720Sarybchikef10_nvram_partn_set_version(
461299720Sarybchik	__in			efx_nic_t *enp,
462299720Sarybchik	__in			uint32_t partn,
463299720Sarybchik	__in_ecount(4)		uint16_t version[4]);
464299720Sarybchik
465299720Sarybchikextern	__checkReturn		efx_rc_t
466299720Sarybchikef10_nvram_buffer_validate(
467299720Sarybchik	__in			efx_nic_t *enp,
468299720Sarybchik	__in			uint32_t partn,
469299720Sarybchik	__in_bcount(buffer_size)
470299720Sarybchik				caddr_t bufferp,
471299720Sarybchik	__in			size_t buffer_size);
472299720Sarybchik
473299720Sarybchikextern	__checkReturn		efx_rc_t
474299720Sarybchikef10_nvram_buffer_create(
475299720Sarybchik	__in			efx_nic_t *enp,
476299720Sarybchik	__in			uint16_t partn_type,
477299720Sarybchik	__in_bcount(buffer_size)
478299720Sarybchik				caddr_t bufferp,
479299720Sarybchik	__in			size_t buffer_size);
480299720Sarybchik
481299720Sarybchikextern	__checkReturn		efx_rc_t
482299720Sarybchikef10_nvram_buffer_find_item_start(
483299720Sarybchik	__in_bcount(buffer_size)
484299720Sarybchik				caddr_t bufferp,
485299720Sarybchik	__in			size_t buffer_size,
486299720Sarybchik	__out			uint32_t *startp
487299720Sarybchik	);
488299720Sarybchik
489299720Sarybchikextern	__checkReturn		efx_rc_t
490299720Sarybchikef10_nvram_buffer_find_end(
491299720Sarybchik	__in_bcount(buffer_size)
492299720Sarybchik				caddr_t bufferp,
493299720Sarybchik	__in			size_t buffer_size,
494299720Sarybchik	__in			uint32_t offset,
495299720Sarybchik	__out			uint32_t *endp
496299720Sarybchik	);
497299720Sarybchik
498299720Sarybchikextern	__checkReturn	__success(return != B_FALSE)	boolean_t
499299720Sarybchikef10_nvram_buffer_find_item(
500299720Sarybchik	__in_bcount(buffer_size)
501299720Sarybchik				caddr_t bufferp,
502299720Sarybchik	__in			size_t buffer_size,
503299720Sarybchik	__in			uint32_t offset,
504299720Sarybchik	__out			uint32_t *startp,
505299720Sarybchik	__out			uint32_t *lengthp
506299720Sarybchik	);
507299720Sarybchik
508299720Sarybchikextern	__checkReturn		efx_rc_t
509299720Sarybchikef10_nvram_buffer_get_item(
510299720Sarybchik	__in_bcount(buffer_size)
511299720Sarybchik				caddr_t bufferp,
512299720Sarybchik	__in			size_t buffer_size,
513299720Sarybchik	__in			uint32_t offset,
514299720Sarybchik	__in			uint32_t length,
515299720Sarybchik	__out_bcount_part(item_max_size, *lengthp)
516299720Sarybchik				caddr_t itemp,
517299720Sarybchik	__in			size_t item_max_size,
518299720Sarybchik	__out			uint32_t *lengthp
519299720Sarybchik	);
520299720Sarybchik
521299720Sarybchikextern	__checkReturn		efx_rc_t
522299720Sarybchikef10_nvram_buffer_insert_item(
523299720Sarybchik	__in_bcount(buffer_size)
524299720Sarybchik				caddr_t bufferp,
525299720Sarybchik	__in			size_t buffer_size,
526299720Sarybchik	__in			uint32_t offset,
527299720Sarybchik	__in_bcount(length)	caddr_t keyp,
528299720Sarybchik	__in			uint32_t length,
529299720Sarybchik	__out			uint32_t *lengthp
530299720Sarybchik	);
531299720Sarybchik
532299720Sarybchikextern	__checkReturn		efx_rc_t
533299720Sarybchikef10_nvram_buffer_delete_item(
534299720Sarybchik	__in_bcount(buffer_size)
535299720Sarybchik				caddr_t bufferp,
536299720Sarybchik	__in			size_t buffer_size,
537299720Sarybchik	__in			uint32_t offset,
538299720Sarybchik	__in			uint32_t length,
539299720Sarybchik	__in			uint32_t end
540299720Sarybchik	);
541299720Sarybchik
542299720Sarybchikextern	__checkReturn		efx_rc_t
543299720Sarybchikef10_nvram_buffer_finish(
544299720Sarybchik	__in_bcount(buffer_size)
545299720Sarybchik				caddr_t bufferp,
546299720Sarybchik	__in			size_t buffer_size
547299720Sarybchik	);
548299720Sarybchik
549299720Sarybchik#endif	/* EFSYS_OPT_NVRAM */
550299720Sarybchik
551299720Sarybchik
552299720Sarybchik/* PHY */
553299720Sarybchik
554299720Sarybchiktypedef struct ef10_link_state_s {
555299720Sarybchik	uint32_t		els_adv_cap_mask;
556299720Sarybchik	uint32_t		els_lp_cap_mask;
557299720Sarybchik	unsigned int		els_fcntl;
558299720Sarybchik	efx_link_mode_t		els_link_mode;
559299720Sarybchik#if EFSYS_OPT_LOOPBACK
560299720Sarybchik	efx_loopback_type_t	els_loopback;
561299720Sarybchik#endif
562299720Sarybchik	boolean_t		els_mac_up;
563299720Sarybchik} ef10_link_state_t;
564299720Sarybchik
565299720Sarybchikextern			void
566299720Sarybchikef10_phy_link_ev(
567299720Sarybchik	__in		efx_nic_t *enp,
568299720Sarybchik	__in		efx_qword_t *eqp,
569299720Sarybchik	__out		efx_link_mode_t *link_modep);
570299720Sarybchik
571299720Sarybchikextern	__checkReturn	efx_rc_t
572299720Sarybchikef10_phy_get_link(
573299720Sarybchik	__in		efx_nic_t *enp,
574299720Sarybchik	__out		ef10_link_state_t *elsp);
575299720Sarybchik
576299720Sarybchikextern	__checkReturn	efx_rc_t
577299720Sarybchikef10_phy_power(
578299720Sarybchik	__in		efx_nic_t *enp,
579299720Sarybchik	__in		boolean_t on);
580299720Sarybchik
581299720Sarybchikextern	__checkReturn	efx_rc_t
582299720Sarybchikef10_phy_reconfigure(
583299720Sarybchik	__in		efx_nic_t *enp);
584299720Sarybchik
585299720Sarybchikextern	__checkReturn	efx_rc_t
586299720Sarybchikef10_phy_verify(
587299720Sarybchik	__in		efx_nic_t *enp);
588299720Sarybchik
589299720Sarybchikextern	__checkReturn	efx_rc_t
590299720Sarybchikef10_phy_oui_get(
591299720Sarybchik	__in		efx_nic_t *enp,
592299720Sarybchik	__out		uint32_t *ouip);
593299720Sarybchik
594299720Sarybchik#if EFSYS_OPT_PHY_STATS
595299720Sarybchik
596299720Sarybchikextern	__checkReturn			efx_rc_t
597299720Sarybchikef10_phy_stats_update(
598299720Sarybchik	__in				efx_nic_t *enp,
599299720Sarybchik	__in				efsys_mem_t *esmp,
600299720Sarybchik	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
601299720Sarybchik
602299720Sarybchik#endif	/* EFSYS_OPT_PHY_STATS */
603299720Sarybchik
604299720Sarybchik
605299720Sarybchik/* TX */
606299720Sarybchik
607299720Sarybchikextern	__checkReturn	efx_rc_t
608299720Sarybchikef10_tx_init(
609299720Sarybchik	__in		efx_nic_t *enp);
610299720Sarybchik
611299720Sarybchikextern			void
612299720Sarybchikef10_tx_fini(
613299720Sarybchik	__in		efx_nic_t *enp);
614299720Sarybchik
615299720Sarybchikextern	__checkReturn	efx_rc_t
616299720Sarybchikef10_tx_qcreate(
617299720Sarybchik	__in		efx_nic_t *enp,
618299720Sarybchik	__in		unsigned int index,
619299720Sarybchik	__in		unsigned int label,
620299720Sarybchik	__in		efsys_mem_t *esmp,
621299720Sarybchik	__in		size_t n,
622299720Sarybchik	__in		uint32_t id,
623299720Sarybchik	__in		uint16_t flags,
624299720Sarybchik	__in		efx_evq_t *eep,
625299720Sarybchik	__in		efx_txq_t *etp,
626299720Sarybchik	__out		unsigned int *addedp);
627299720Sarybchik
628299720Sarybchikextern		void
629299720Sarybchikef10_tx_qdestroy(
630299720Sarybchik	__in		efx_txq_t *etp);
631299720Sarybchik
632299720Sarybchikextern	__checkReturn	efx_rc_t
633299720Sarybchikef10_tx_qpost(
634299720Sarybchik	__in		efx_txq_t *etp,
635299720Sarybchik	__in_ecount(n)	efx_buffer_t *eb,
636299720Sarybchik	__in		unsigned int n,
637299720Sarybchik	__in		unsigned int completed,
638299720Sarybchik	__inout		unsigned int *addedp);
639299720Sarybchik
640299720Sarybchikextern			void
641299720Sarybchikef10_tx_qpush(
642299720Sarybchik	__in		efx_txq_t *etp,
643299720Sarybchik	__in		unsigned int added,
644299720Sarybchik	__in		unsigned int pushed);
645299720Sarybchik
646299720Sarybchikextern	__checkReturn	efx_rc_t
647299720Sarybchikef10_tx_qpace(
648299720Sarybchik	__in		efx_txq_t *etp,
649299720Sarybchik	__in		unsigned int ns);
650299720Sarybchik
651299720Sarybchikextern	__checkReturn	efx_rc_t
652299720Sarybchikef10_tx_qflush(
653299720Sarybchik	__in		efx_txq_t *etp);
654299720Sarybchik
655299720Sarybchikextern			void
656299720Sarybchikef10_tx_qenable(
657299720Sarybchik	__in		efx_txq_t *etp);
658299720Sarybchik
659299720Sarybchikextern	__checkReturn	efx_rc_t
660299720Sarybchikef10_tx_qpio_enable(
661299720Sarybchik	__in		efx_txq_t *etp);
662299720Sarybchik
663299720Sarybchikextern			void
664299720Sarybchikef10_tx_qpio_disable(
665299720Sarybchik	__in		efx_txq_t *etp);
666299720Sarybchik
667299720Sarybchikextern	__checkReturn	efx_rc_t
668299720Sarybchikef10_tx_qpio_write(
669299720Sarybchik	__in			efx_txq_t *etp,
670299720Sarybchik	__in_ecount(buf_length)	uint8_t *buffer,
671299720Sarybchik	__in			size_t buf_length,
672299720Sarybchik	__in			size_t pio_buf_offset);
673299720Sarybchik
674299720Sarybchikextern	__checkReturn	efx_rc_t
675299720Sarybchikef10_tx_qpio_post(
676299720Sarybchik	__in			efx_txq_t *etp,
677299720Sarybchik	__in			size_t pkt_length,
678299720Sarybchik	__in			unsigned int completed,
679299720Sarybchik	__inout			unsigned int *addedp);
680299720Sarybchik
681299720Sarybchikextern	__checkReturn	efx_rc_t
682299720Sarybchikef10_tx_qdesc_post(
683299720Sarybchik	__in		efx_txq_t *etp,
684299720Sarybchik	__in_ecount(n)	efx_desc_t *ed,
685299720Sarybchik	__in		unsigned int n,
686299720Sarybchik	__in		unsigned int completed,
687299720Sarybchik	__inout		unsigned int *addedp);
688299720Sarybchik
689299720Sarybchikextern	void
690299720Sarybchikef10_tx_qdesc_dma_create(
691299720Sarybchik	__in	efx_txq_t *etp,
692299720Sarybchik	__in	efsys_dma_addr_t addr,
693299720Sarybchik	__in	size_t size,
694299720Sarybchik	__in	boolean_t eop,
695299720Sarybchik	__out	efx_desc_t *edp);
696299720Sarybchik
697299720Sarybchikextern	void
698299720Sarybchikef10_tx_qdesc_tso_create(
699299720Sarybchik	__in	efx_txq_t *etp,
700299720Sarybchik	__in	uint16_t ipv4_id,
701299720Sarybchik	__in	uint32_t tcp_seq,
702299720Sarybchik	__in	uint8_t	 tcp_flags,
703299720Sarybchik	__out	efx_desc_t *edp);
704299720Sarybchik
705299720Sarybchikextern	void
706299720Sarybchikef10_tx_qdesc_tso2_create(
707299720Sarybchik	__in			efx_txq_t *etp,
708299720Sarybchik	__in			uint16_t ipv4_id,
709299720Sarybchik	__in			uint32_t tcp_seq,
710299720Sarybchik	__in			uint16_t tcp_mss,
711299720Sarybchik	__out_ecount(count)	efx_desc_t *edp,
712299720Sarybchik	__in			int count);
713299720Sarybchik
714299720Sarybchikextern	void
715299720Sarybchikef10_tx_qdesc_vlantci_create(
716299720Sarybchik	__in	efx_txq_t *etp,
717299720Sarybchik	__in	uint16_t vlan_tci,
718299720Sarybchik	__out	efx_desc_t *edp);
719299720Sarybchik
720299720Sarybchik
721299720Sarybchik#if EFSYS_OPT_QSTATS
722299720Sarybchik
723299720Sarybchikextern			void
724299720Sarybchikef10_tx_qstats_update(
725299720Sarybchik	__in				efx_txq_t *etp,
726299720Sarybchik	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
727299720Sarybchik
728299720Sarybchik#endif /* EFSYS_OPT_QSTATS */
729299720Sarybchik
730299720Sarybchiktypedef uint32_t	efx_piobuf_handle_t;
731299720Sarybchik
732299720Sarybchik#define	EFX_PIOBUF_HANDLE_INVALID	((efx_piobuf_handle_t) -1)
733299720Sarybchik
734299720Sarybchikextern	__checkReturn	efx_rc_t
735299720Sarybchikef10_nic_pio_alloc(
736299720Sarybchik	__inout		efx_nic_t *enp,
737299720Sarybchik	__out		uint32_t *bufnump,
738299720Sarybchik	__out		efx_piobuf_handle_t *handlep,
739299720Sarybchik	__out		uint32_t *blknump,
740299720Sarybchik	__out		uint32_t *offsetp,
741299720Sarybchik	__out		size_t *sizep);
742299720Sarybchik
743299720Sarybchikextern	__checkReturn	efx_rc_t
744299720Sarybchikef10_nic_pio_free(
745299720Sarybchik	__inout		efx_nic_t *enp,
746299720Sarybchik	__in		uint32_t bufnum,
747299720Sarybchik	__in		uint32_t blknum);
748299720Sarybchik
749299720Sarybchikextern	__checkReturn	efx_rc_t
750299720Sarybchikef10_nic_pio_link(
751299720Sarybchik	__inout		efx_nic_t *enp,
752299720Sarybchik	__in		uint32_t vi_index,
753299720Sarybchik	__in		efx_piobuf_handle_t handle);
754299720Sarybchik
755299720Sarybchikextern	__checkReturn	efx_rc_t
756299720Sarybchikef10_nic_pio_unlink(
757299720Sarybchik	__inout		efx_nic_t *enp,
758299720Sarybchik	__in		uint32_t vi_index);
759299720Sarybchik
760299720Sarybchik
761299720Sarybchik/* VPD */
762299720Sarybchik
763299720Sarybchik#if EFSYS_OPT_VPD
764299720Sarybchik
765299720Sarybchikextern	__checkReturn		efx_rc_t
766299720Sarybchikef10_vpd_init(
767299720Sarybchik	__in			efx_nic_t *enp);
768299720Sarybchik
769299720Sarybchikextern	__checkReturn		efx_rc_t
770299720Sarybchikef10_vpd_size(
771299720Sarybchik	__in			efx_nic_t *enp,
772299720Sarybchik	__out			size_t *sizep);
773299720Sarybchik
774299720Sarybchikextern	__checkReturn		efx_rc_t
775299720Sarybchikef10_vpd_read(
776299720Sarybchik	__in			efx_nic_t *enp,
777299720Sarybchik	__out_bcount(size)	caddr_t data,
778299720Sarybchik	__in			size_t size);
779299720Sarybchik
780299720Sarybchikextern	__checkReturn		efx_rc_t
781299720Sarybchikef10_vpd_verify(
782299720Sarybchik	__in			efx_nic_t *enp,
783299720Sarybchik	__in_bcount(size)	caddr_t data,
784299720Sarybchik	__in			size_t size);
785299720Sarybchik
786299720Sarybchikextern	__checkReturn		efx_rc_t
787299720Sarybchikef10_vpd_reinit(
788299720Sarybchik	__in			efx_nic_t *enp,
789299720Sarybchik	__in_bcount(size)	caddr_t data,
790299720Sarybchik	__in			size_t size);
791299720Sarybchik
792299720Sarybchikextern	__checkReturn		efx_rc_t
793299720Sarybchikef10_vpd_get(
794299720Sarybchik	__in			efx_nic_t *enp,
795299720Sarybchik	__in_bcount(size)	caddr_t data,
796299720Sarybchik	__in			size_t size,
797299720Sarybchik	__inout			efx_vpd_value_t *evvp);
798299720Sarybchik
799299720Sarybchikextern	__checkReturn		efx_rc_t
800299720Sarybchikef10_vpd_set(
801299720Sarybchik	__in			efx_nic_t *enp,
802299720Sarybchik	__in_bcount(size)	caddr_t data,
803299720Sarybchik	__in			size_t size,
804299720Sarybchik	__in			efx_vpd_value_t *evvp);
805299720Sarybchik
806299720Sarybchikextern	__checkReturn		efx_rc_t
807299720Sarybchikef10_vpd_next(
808299720Sarybchik	__in			efx_nic_t *enp,
809299720Sarybchik	__in_bcount(size)	caddr_t data,
810299720Sarybchik	__in			size_t size,
811299720Sarybchik	__out			efx_vpd_value_t *evvp,
812299720Sarybchik	__inout			unsigned int *contp);
813299720Sarybchik
814299720Sarybchikextern __checkReturn		efx_rc_t
815299720Sarybchikef10_vpd_write(
816299720Sarybchik	__in			efx_nic_t *enp,
817299720Sarybchik	__in_bcount(size)	caddr_t data,
818299720Sarybchik	__in			size_t size);
819299720Sarybchik
820299720Sarybchikextern				void
821299720Sarybchikef10_vpd_fini(
822299720Sarybchik	__in			efx_nic_t *enp);
823299720Sarybchik
824299720Sarybchik#endif	/* EFSYS_OPT_VPD */
825299720Sarybchik
826299720Sarybchik
827299720Sarybchik/* RX */
828299720Sarybchik
829299720Sarybchikextern	__checkReturn	efx_rc_t
830299720Sarybchikef10_rx_init(
831299720Sarybchik	__in		efx_nic_t *enp);
832299720Sarybchik
833299720Sarybchik#if EFSYS_OPT_RX_SCATTER
834299720Sarybchikextern	__checkReturn	efx_rc_t
835299720Sarybchikef10_rx_scatter_enable(
836299720Sarybchik	__in		efx_nic_t *enp,
837299720Sarybchik	__in		unsigned int buf_size);
838299720Sarybchik#endif	/* EFSYS_OPT_RX_SCATTER */
839299720Sarybchik
840299720Sarybchik
841299720Sarybchik#if EFSYS_OPT_RX_SCALE
842299720Sarybchik
843299720Sarybchikextern	__checkReturn	efx_rc_t
844299720Sarybchikef10_rx_scale_mode_set(
845299720Sarybchik	__in		efx_nic_t *enp,
846299720Sarybchik	__in		efx_rx_hash_alg_t alg,
847299720Sarybchik	__in		efx_rx_hash_type_t type,
848299720Sarybchik	__in		boolean_t insert);
849299720Sarybchik
850299720Sarybchikextern	__checkReturn	efx_rc_t
851299720Sarybchikef10_rx_scale_key_set(
852299720Sarybchik	__in		efx_nic_t *enp,
853299720Sarybchik	__in_ecount(n)	uint8_t *key,
854299720Sarybchik	__in		size_t n);
855299720Sarybchik
856299720Sarybchikextern	__checkReturn	efx_rc_t
857299720Sarybchikef10_rx_scale_tbl_set(
858299720Sarybchik	__in		efx_nic_t *enp,
859299720Sarybchik	__in_ecount(n)	unsigned int *table,
860299720Sarybchik	__in		size_t n);
861299720Sarybchik
862299720Sarybchikextern	__checkReturn	uint32_t
863299720Sarybchikef10_rx_prefix_hash(
864299720Sarybchik	__in		efx_nic_t *enp,
865299720Sarybchik	__in		efx_rx_hash_alg_t func,
866299720Sarybchik	__in		uint8_t *buffer);
867299720Sarybchik
868299720Sarybchik#endif /* EFSYS_OPT_RX_SCALE */
869299720Sarybchik
870299720Sarybchikextern	__checkReturn	efx_rc_t
871299720Sarybchikef10_rx_prefix_pktlen(
872299720Sarybchik	__in		efx_nic_t *enp,
873299720Sarybchik	__in		uint8_t *buffer,
874299720Sarybchik	__out		uint16_t *lengthp);
875299720Sarybchik
876299720Sarybchikextern			void
877299720Sarybchikef10_rx_qpost(
878299720Sarybchik	__in		efx_rxq_t *erp,
879299720Sarybchik	__in_ecount(n)	efsys_dma_addr_t *addrp,
880299720Sarybchik	__in		size_t size,
881299720Sarybchik	__in		unsigned int n,
882299720Sarybchik	__in		unsigned int completed,
883299720Sarybchik	__in		unsigned int added);
884299720Sarybchik
885299720Sarybchikextern			void
886299720Sarybchikef10_rx_qpush(
887299720Sarybchik	__in		efx_rxq_t *erp,
888299720Sarybchik	__in		unsigned int added,
889299720Sarybchik	__inout		unsigned int *pushedp);
890299720Sarybchik
891299720Sarybchikextern	__checkReturn	efx_rc_t
892299720Sarybchikef10_rx_qflush(
893299720Sarybchik	__in		efx_rxq_t *erp);
894299720Sarybchik
895299720Sarybchikextern		void
896299720Sarybchikef10_rx_qenable(
897299720Sarybchik	__in		efx_rxq_t *erp);
898299720Sarybchik
899299720Sarybchikextern	__checkReturn	efx_rc_t
900299720Sarybchikef10_rx_qcreate(
901299720Sarybchik	__in		efx_nic_t *enp,
902299720Sarybchik	__in		unsigned int index,
903299720Sarybchik	__in		unsigned int label,
904299720Sarybchik	__in		efx_rxq_type_t type,
905299720Sarybchik	__in		efsys_mem_t *esmp,
906299720Sarybchik	__in		size_t n,
907299720Sarybchik	__in		uint32_t id,
908299720Sarybchik	__in		efx_evq_t *eep,
909299720Sarybchik	__in		efx_rxq_t *erp);
910299720Sarybchik
911299720Sarybchikextern			void
912299720Sarybchikef10_rx_qdestroy(
913299720Sarybchik	__in		efx_rxq_t *erp);
914299720Sarybchik
915299720Sarybchikextern			void
916299720Sarybchikef10_rx_fini(
917299720Sarybchik	__in		efx_nic_t *enp);
918299720Sarybchik
919299720Sarybchik#if EFSYS_OPT_FILTER
920299720Sarybchik
921299720Sarybchiktypedef struct ef10_filter_handle_s {
922299720Sarybchik	uint32_t	efh_lo;
923299720Sarybchik	uint32_t	efh_hi;
924299720Sarybchik} ef10_filter_handle_t;
925299720Sarybchik
926299720Sarybchiktypedef struct ef10_filter_entry_s {
927299720Sarybchik	uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
928299720Sarybchik	ef10_filter_handle_t efe_handle;
929299720Sarybchik} ef10_filter_entry_t;
930299720Sarybchik
931299720Sarybchik/*
932299720Sarybchik * BUSY flag indicates that an update is in progress.
933299720Sarybchik * AUTO_OLD flag is used to mark and sweep MAC packet filters.
934299720Sarybchik */
935299720Sarybchik#define	EFX_EF10_FILTER_FLAG_BUSY	1U
936299720Sarybchik#define	EFX_EF10_FILTER_FLAG_AUTO_OLD	2U
937299720Sarybchik#define	EFX_EF10_FILTER_FLAGS		3U
938299720Sarybchik
939299720Sarybchik/*
940299720Sarybchik * Size of the hash table used by the driver. Doesn't need to be the
941299720Sarybchik * same size as the hardware's table.
942299720Sarybchik */
943299720Sarybchik#define	EFX_EF10_FILTER_TBL_ROWS 8192
944299720Sarybchik
945299720Sarybchik/* Only need to allow for one directed and one unknown unicast filter */
946299720Sarybchik#define	EFX_EF10_FILTER_UNICAST_FILTERS_MAX	2
947299720Sarybchik
948299720Sarybchik/* Allow for the broadcast address to be added to the multicast list */
949299720Sarybchik#define	EFX_EF10_FILTER_MULTICAST_FILTERS_MAX	(EFX_MAC_MULTICAST_LIST_MAX + 1)
950299720Sarybchik
951299720Sarybchiktypedef struct ef10_filter_table_s {
952299720Sarybchik	ef10_filter_entry_t	eft_entry[EFX_EF10_FILTER_TBL_ROWS];
953310917Sarybchik	efx_rxq_t		*eft_default_rxq;
954299720Sarybchik	boolean_t		eft_using_rss;
955299720Sarybchik	uint32_t		eft_unicst_filter_indexes[
956299720Sarybchik	    EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
957299720Sarybchik	boolean_t		eft_unicst_filter_count;
958299720Sarybchik	uint32_t		eft_mulcst_filter_indexes[
959299720Sarybchik	    EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
960299720Sarybchik	uint32_t		eft_mulcst_filter_count;
961299720Sarybchik	boolean_t		eft_using_all_mulcst;
962299720Sarybchik} ef10_filter_table_t;
963299720Sarybchik
964299720Sarybchik	__checkReturn	efx_rc_t
965299720Sarybchikef10_filter_init(
966299720Sarybchik	__in		efx_nic_t *enp);
967299720Sarybchik
968299720Sarybchik			void
969299720Sarybchikef10_filter_fini(
970299720Sarybchik	__in		efx_nic_t *enp);
971299720Sarybchik
972299720Sarybchik	__checkReturn	efx_rc_t
973299720Sarybchikef10_filter_restore(
974299720Sarybchik	__in		efx_nic_t *enp);
975299720Sarybchik
976299720Sarybchik	__checkReturn	efx_rc_t
977299720Sarybchikef10_filter_add(
978299720Sarybchik	__in		efx_nic_t *enp,
979299720Sarybchik	__inout		efx_filter_spec_t *spec,
980299720Sarybchik	__in		boolean_t may_replace);
981299720Sarybchik
982299720Sarybchik	__checkReturn	efx_rc_t
983299720Sarybchikef10_filter_delete(
984299720Sarybchik	__in		efx_nic_t *enp,
985299720Sarybchik	__inout		efx_filter_spec_t *spec);
986299720Sarybchik
987299720Sarybchikextern	__checkReturn	efx_rc_t
988299720Sarybchikef10_filter_supported_filters(
989299720Sarybchik	__in		efx_nic_t *enp,
990299720Sarybchik	__out		uint32_t *list,
991299720Sarybchik	__out		size_t *length);
992299720Sarybchik
993299720Sarybchikextern	__checkReturn	efx_rc_t
994299720Sarybchikef10_filter_reconfigure(
995299720Sarybchik	__in				efx_nic_t *enp,
996299720Sarybchik	__in_ecount(6)			uint8_t const *mac_addr,
997299720Sarybchik	__in				boolean_t all_unicst,
998299720Sarybchik	__in				boolean_t mulcst,
999299720Sarybchik	__in				boolean_t all_mulcst,
1000299720Sarybchik	__in				boolean_t brdcst,
1001299720Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
1002299720Sarybchik	__in				uint32_t count);
1003299720Sarybchik
1004299720Sarybchikextern		void
1005299720Sarybchikef10_filter_get_default_rxq(
1006299720Sarybchik	__in		efx_nic_t *enp,
1007299720Sarybchik	__out		efx_rxq_t **erpp,
1008299720Sarybchik	__out		boolean_t *using_rss);
1009299720Sarybchik
1010299720Sarybchikextern		void
1011299720Sarybchikef10_filter_default_rxq_set(
1012299720Sarybchik	__in		efx_nic_t *enp,
1013299720Sarybchik	__in		efx_rxq_t *erp,
1014299720Sarybchik	__in		boolean_t using_rss);
1015299720Sarybchik
1016299720Sarybchikextern		void
1017299720Sarybchikef10_filter_default_rxq_clear(
1018299720Sarybchik	__in		efx_nic_t *enp);
1019299720Sarybchik
1020299720Sarybchik
1021299720Sarybchik#endif /* EFSYS_OPT_FILTER */
1022299720Sarybchik
1023299720Sarybchikextern	__checkReturn			efx_rc_t
1024299720Sarybchikefx_mcdi_get_function_info(
1025299720Sarybchik	__in				efx_nic_t *enp,
1026299720Sarybchik	__out				uint32_t *pfp,
1027299720Sarybchik	__out_opt			uint32_t *vfp);
1028299720Sarybchik
1029299720Sarybchikextern	__checkReturn		efx_rc_t
1030299720Sarybchikefx_mcdi_privilege_mask(
1031299720Sarybchik	__in			efx_nic_t *enp,
1032299720Sarybchik	__in			uint32_t pf,
1033299720Sarybchik	__in			uint32_t vf,
1034299720Sarybchik	__out			uint32_t *maskp);
1035299720Sarybchik
1036299720Sarybchikextern	__checkReturn	efx_rc_t
1037293887Sarybchikefx_mcdi_get_port_assignment(
1038293887Sarybchik	__in		efx_nic_t *enp,
1039293887Sarybchik	__out		uint32_t *portp);
1040293734Sarybchik
1041293887Sarybchikextern	__checkReturn	efx_rc_t
1042293887Sarybchikefx_mcdi_get_port_modes(
1043293887Sarybchik	__in		efx_nic_t *enp,
1044299904Sarybchik	__out		uint32_t *modesp,
1045299904Sarybchik	__out_opt	uint32_t *current_modep);
1046293734Sarybchik
1047293887Sarybchikextern	__checkReturn	efx_rc_t
1048299904Sarybchikef10_nic_get_port_mode_bandwidth(
1049299904Sarybchik	__in		uint32_t port_mode,
1050299904Sarybchik	__out		uint32_t *bandwidth_mbpsp);
1051299904Sarybchik
1052299904Sarybchikextern	__checkReturn	efx_rc_t
1053293887Sarybchikefx_mcdi_get_mac_address_pf(
1054293887Sarybchik	__in			efx_nic_t *enp,
1055293887Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1056293887Sarybchik
1057293887Sarybchikextern	__checkReturn	efx_rc_t
1058293887Sarybchikefx_mcdi_get_mac_address_vf(
1059293887Sarybchik	__in			efx_nic_t *enp,
1060293887Sarybchik	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1061293887Sarybchik
1062293887Sarybchikextern	__checkReturn	efx_rc_t
1063293887Sarybchikefx_mcdi_get_clock(
1064293887Sarybchik	__in		efx_nic_t *enp,
1065300009Sarybchik	__out		uint32_t *sys_freqp,
1066300009Sarybchik	__out		uint32_t *dpcpu_freqp);
1067293887Sarybchik
1068300009Sarybchik
1069293887Sarybchikextern	__checkReturn	efx_rc_t
1070293887Sarybchikefx_mcdi_get_vector_cfg(
1071293887Sarybchik	__in		efx_nic_t *enp,
1072293887Sarybchik	__out_opt	uint32_t *vec_basep,
1073293887Sarybchik	__out_opt	uint32_t *pf_nvecp,
1074293887Sarybchik	__out_opt	uint32_t *vf_nvecp);
1075293887Sarybchik
1076293887Sarybchikextern	__checkReturn	efx_rc_t
1077293887Sarybchikef10_get_datapath_caps(
1078293887Sarybchik	__in		efx_nic_t *enp);
1079293887Sarybchik
1080294079Sarybchikextern	__checkReturn		efx_rc_t
1081294079Sarybchikef10_get_privilege_mask(
1082294079Sarybchik	__in			efx_nic_t *enp,
1083294079Sarybchik	__out			uint32_t *maskp);
1084294079Sarybchik
1085293887Sarybchikextern	__checkReturn	efx_rc_t
1086293887Sarybchikef10_external_port_mapping(
1087293887Sarybchik	__in		efx_nic_t *enp,
1088293887Sarybchik	__in		uint32_t port,
1089293887Sarybchik	__out		uint8_t *external_portp);
1090293887Sarybchik
1091293887Sarybchik
1092293734Sarybchik#ifdef	__cplusplus
1093293734Sarybchik}
1094293734Sarybchik#endif
1095293734Sarybchik
1096293734Sarybchik#endif	/* _SYS_EF10_IMPL_H */
1097