1227569Sphilip/*-
2284555Sarybchik * Copyright (c) 2006-2015 Solarflare Communications Inc.
3284555Sarybchik * All rights reserved.
4227569Sphilip *
5227569Sphilip * Redistribution and use in source and binary forms, with or without
6284555Sarybchik * modification, are permitted provided that the following conditions are met:
7227569Sphilip *
8284555Sarybchik * 1. Redistributions of source code must retain the above copyright notice,
9284555Sarybchik *    this list of conditions and the following disclaimer.
10284555Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice,
11284555Sarybchik *    this list of conditions and the following disclaimer in the documentation
12284555Sarybchik *    and/or other materials provided with the distribution.
13228078Sphilip *
14284555Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15284555Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16284555Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17284555Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18284555Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19284555Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20284555Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21284555Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22284555Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23284555Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24284555Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25284555Sarybchik *
26284555Sarybchik * The views and conclusions contained in the software and documentation are
27284555Sarybchik * those of the authors and should not be interpreted as representing official
28284555Sarybchik * policies, either expressed or implied, of the FreeBSD Project.
29284555Sarybchik *
30228078Sphilip * $FreeBSD: releng/10.3/sys/dev/sfxge/common/efx.h 295526 2016-02-11 16:39:30Z arybchik $
31227569Sphilip */
32227569Sphilip
33227569Sphilip#ifndef	_SYS_EFX_H
34227569Sphilip#define	_SYS_EFX_H
35227569Sphilip
36227569Sphilip#include "efsys.h"
37284555Sarybchik#include "efx_phy_ids.h"
38227569Sphilip
39227569Sphilip#ifdef	__cplusplus
40227569Sphilipextern "C" {
41227569Sphilip#endif
42227569Sphilip
43293927Sarybchik#define	EFX_STATIC_ASSERT(_cond)		\
44293927Sarybchik	((void)sizeof(char[(_cond) ? 1 : -1]))
45227569Sphilip
46293927Sarybchik#define	EFX_ARRAY_SIZE(_array)			\
47293927Sarybchik	(sizeof(_array) / sizeof((_array)[0]))
48227569Sphilip
49293927Sarybchik#define	EFX_FIELD_OFFSET(_type, _field)		\
50293927Sarybchik	((size_t) &(((_type *)0)->_field))
51227569Sphilip
52293927Sarybchik/* Return codes */
53293927Sarybchik
54293927Sarybchiktypedef __success(return == 0) int efx_rc_t;
55293927Sarybchik
56293927Sarybchik
57293927Sarybchik/* Chip families */
58293927Sarybchik
59227569Sphiliptypedef enum efx_family_e {
60227569Sphilip	EFX_FAMILY_INVALID,
61227569Sphilip	EFX_FAMILY_FALCON,
62227569Sphilip	EFX_FAMILY_SIENA,
63284555Sarybchik	EFX_FAMILY_HUNTINGTON,
64293975Sarybchik	EFX_FAMILY_MEDFORD,
65227569Sphilip	EFX_FAMILY_NTYPES
66227569Sphilip} efx_family_t;
67227569Sphilip
68293927Sarybchikextern	__checkReturn	efx_rc_t
69227569Sphilipefx_family(
70227569Sphilip	__in		uint16_t venid,
71227569Sphilip	__in		uint16_t devid,
72227569Sphilip	__out		efx_family_t *efp);
73227569Sphilip
74293927Sarybchikextern	__checkReturn	efx_rc_t
75227569Sphilipefx_infer_family(
76227569Sphilip	__in		efsys_bar_t *esbp,
77227569Sphilip	__out		efx_family_t *efp);
78227569Sphilip
79284555Sarybchik#define	EFX_PCI_VENID_SFC			0x1924
80227569Sphilip
81284555Sarybchik#define	EFX_PCI_DEVID_FALCON			0x0710	/* SFC4000 */
82284555Sarybchik
83284555Sarybchik#define	EFX_PCI_DEVID_BETHPAGE			0x0803	/* SFC9020 */
84284555Sarybchik#define	EFX_PCI_DEVID_SIENA			0x0813	/* SFL9021 */
85284555Sarybchik#define	EFX_PCI_DEVID_SIENA_F1_UNINIT		0x0810
86284555Sarybchik
87284555Sarybchik#define	EFX_PCI_DEVID_HUNTINGTON_PF_UNINIT	0x0901
88284555Sarybchik#define	EFX_PCI_DEVID_FARMINGDALE		0x0903	/* SFC9120 PF */
89284555Sarybchik#define	EFX_PCI_DEVID_GREENPORT			0x0923	/* SFC9140 PF */
90284555Sarybchik
91284555Sarybchik#define	EFX_PCI_DEVID_FARMINGDALE_VF		0x1903	/* SFC9120 VF */
92284555Sarybchik#define	EFX_PCI_DEVID_GREENPORT_VF		0x1923	/* SFC9140 VF */
93284555Sarybchik
94293975Sarybchik#define	EFX_PCI_DEVID_MEDFORD_PF_UNINIT		0x0913
95293975Sarybchik#define	EFX_PCI_DEVID_MEDFORD			0x0A03	/* SFC9240 PF */
96293975Sarybchik#define	EFX_PCI_DEVID_MEDFORD_VF		0x1A03	/* SFC9240 VF */
97284555Sarybchik
98227569Sphilip#define	EFX_MEM_BAR	2
99227569Sphilip
100227569Sphilip/* Error codes */
101227569Sphilip
102227569Sphilipenum {
103227569Sphilip	EFX_ERR_INVALID,
104227569Sphilip	EFX_ERR_SRAM_OOB,
105227569Sphilip	EFX_ERR_BUFID_DC_OOB,
106227569Sphilip	EFX_ERR_MEM_PERR,
107227569Sphilip	EFX_ERR_RBUF_OWN,
108227569Sphilip	EFX_ERR_TBUF_OWN,
109227569Sphilip	EFX_ERR_RDESQ_OWN,
110227569Sphilip	EFX_ERR_TDESQ_OWN,
111227569Sphilip	EFX_ERR_EVQ_OWN,
112227569Sphilip	EFX_ERR_EVFF_OFLO,
113227569Sphilip	EFX_ERR_ILL_ADDR,
114227569Sphilip	EFX_ERR_SRAM_PERR,
115227569Sphilip	EFX_ERR_NCODES
116227569Sphilip};
117227569Sphilip
118284555Sarybchik/* Calculate the IEEE 802.3 CRC32 of a MAC addr */
119284555Sarybchikextern	__checkReturn		uint32_t
120284555Sarybchikefx_crc32_calculate(
121284555Sarybchik	__in			uint32_t crc_init,
122284555Sarybchik	__in_ecount(length)	uint8_t const *input,
123284555Sarybchik	__in			int length);
124284555Sarybchik
125284555Sarybchik
126284555Sarybchik/* Type prototypes */
127284555Sarybchik
128284555Sarybchiktypedef struct efx_rxq_s	efx_rxq_t;
129284555Sarybchik
130227569Sphilip/* NIC */
131227569Sphilip
132227569Sphiliptypedef struct efx_nic_s	efx_nic_t;
133227569Sphilip
134284555Sarybchik#define	EFX_NIC_FUNC_PRIMARY	0x00000001
135284555Sarybchik#define	EFX_NIC_FUNC_LINKCTRL	0x00000002
136284555Sarybchik#define	EFX_NIC_FUNC_TRUSTED	0x00000004
137284555Sarybchik
138284555Sarybchik
139293927Sarybchikextern	__checkReturn	efx_rc_t
140227569Sphilipefx_nic_create(
141227569Sphilip	__in		efx_family_t family,
142227569Sphilip	__in		efsys_identifier_t *esip,
143227569Sphilip	__in		efsys_bar_t *esbp,
144227569Sphilip	__in		efsys_lock_t *eslp,
145227569Sphilip	__deref_out	efx_nic_t **enpp);
146227569Sphilip
147293927Sarybchikextern	__checkReturn	efx_rc_t
148227569Sphilipefx_nic_probe(
149227569Sphilip	__in		efx_nic_t *enp);
150227569Sphilip
151227569Sphilip#if EFSYS_OPT_PCIE_TUNE
152227569Sphilip
153293927Sarybchikextern	__checkReturn	efx_rc_t
154227569Sphilipefx_nic_pcie_tune(
155227569Sphilip	__in		efx_nic_t *enp,
156227569Sphilip	unsigned int	nlanes);
157227569Sphilip
158293927Sarybchikextern	__checkReturn	efx_rc_t
159227569Sphilipefx_nic_pcie_extended_sync(
160227569Sphilip	__in		efx_nic_t *enp);
161227569Sphilip
162227569Sphilip#endif	/* EFSYS_OPT_PCIE_TUNE */
163227569Sphilip
164293927Sarybchikextern	__checkReturn	efx_rc_t
165227569Sphilipefx_nic_init(
166227569Sphilip	__in		efx_nic_t *enp);
167227569Sphilip
168293927Sarybchikextern	__checkReturn	efx_rc_t
169227569Sphilipefx_nic_reset(
170227569Sphilip	__in		efx_nic_t *enp);
171227569Sphilip
172227569Sphilip#if EFSYS_OPT_DIAG
173227569Sphilip
174293927Sarybchikextern	__checkReturn	efx_rc_t
175227569Sphilipefx_nic_register_test(
176227569Sphilip	__in		efx_nic_t *enp);
177227569Sphilip
178227569Sphilip#endif	/* EFSYS_OPT_DIAG */
179227569Sphilip
180227569Sphilipextern		void
181227569Sphilipefx_nic_fini(
182227569Sphilip	__in		efx_nic_t *enp);
183227569Sphilip
184227569Sphilipextern		void
185227569Sphilipefx_nic_unprobe(
186227569Sphilip	__in		efx_nic_t *enp);
187227569Sphilip
188227569Sphilipextern 		void
189227569Sphilipefx_nic_destroy(
190227569Sphilip	__in	efx_nic_t *enp);
191227569Sphilip
192227569Sphilip#if EFSYS_OPT_MCDI
193227569Sphilip
194293976Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
195293976Sarybchik/* Huntington and Medford require MCDIv2 commands */
196284555Sarybchik#define	WITH_MCDI_V2 1
197284555Sarybchik#endif
198284555Sarybchik
199227569Sphiliptypedef struct efx_mcdi_req_s efx_mcdi_req_t;
200227569Sphilip
201227569Sphiliptypedef enum efx_mcdi_exception_e {
202227569Sphilip	EFX_MCDI_EXCEPTION_MC_REBOOT,
203227569Sphilip	EFX_MCDI_EXCEPTION_MC_BADASSERT,
204227569Sphilip} efx_mcdi_exception_t;
205227569Sphilip
206293939Sarybchik#if EFSYS_OPT_MCDI_LOGGING
207293939Sarybchiktypedef enum efx_log_msg_e
208293939Sarybchik{
209293939Sarybchik	EFX_LOG_INVALID,
210293939Sarybchik	EFX_LOG_MCDI_REQUEST,
211293939Sarybchik	EFX_LOG_MCDI_RESPONSE,
212293939Sarybchik} efx_log_msg_t;
213293939Sarybchik#endif /* EFSYS_OPT_MCDI_LOGGING */
214293939Sarybchik
215227569Sphiliptypedef struct efx_mcdi_transport_s {
216227569Sphilip	void		*emt_context;
217284555Sarybchik	efsys_mem_t	*emt_dma_mem;
218227569Sphilip	void		(*emt_execute)(void *, efx_mcdi_req_t *);
219227569Sphilip	void		(*emt_ev_cpl)(void *);
220227569Sphilip	void		(*emt_exception)(void *, efx_mcdi_exception_t);
221293939Sarybchik#if EFSYS_OPT_MCDI_LOGGING
222293939Sarybchik	void		(*emt_logger)(void *, efx_log_msg_t,
223293939Sarybchik					void *, size_t, void *, size_t);
224293939Sarybchik#endif /* EFSYS_OPT_MCDI_LOGGING */
225293963Sarybchik#if EFSYS_OPT_MCDI_PROXY_AUTH
226293963Sarybchik	void		(*emt_ev_proxy_response)(void *, uint32_t, efx_rc_t);
227293963Sarybchik#endif /* EFSYS_OPT_MCDI_PROXY_AUTH */
228227569Sphilip} efx_mcdi_transport_t;
229227569Sphilip
230293927Sarybchikextern	__checkReturn	efx_rc_t
231227569Sphilipefx_mcdi_init(
232227569Sphilip	__in		efx_nic_t *enp,
233227569Sphilip	__in		const efx_mcdi_transport_t *mtp);
234227569Sphilip
235293927Sarybchikextern	__checkReturn	efx_rc_t
236227569Sphilipefx_mcdi_reboot(
237227569Sphilip	__in		efx_nic_t *enp);
238227569Sphilip
239284555Sarybchik			void
240284555Sarybchikefx_mcdi_new_epoch(
241284555Sarybchik	__in		efx_nic_t *enp);
242284555Sarybchik
243227569Sphilipextern			void
244227569Sphilipefx_mcdi_request_start(
245227569Sphilip	__in		efx_nic_t *enp,
246227569Sphilip	__in		efx_mcdi_req_t *emrp,
247227569Sphilip	__in		boolean_t ev_cpl);
248227569Sphilip
249227569Sphilipextern	__checkReturn	boolean_t
250227569Sphilipefx_mcdi_request_poll(
251227569Sphilip	__in		efx_nic_t *enp);
252227569Sphilip
253227569Sphilipextern	__checkReturn	boolean_t
254227569Sphilipefx_mcdi_request_abort(
255227569Sphilip	__in		efx_nic_t *enp);
256227569Sphilip
257227569Sphilipextern			void
258227569Sphilipefx_mcdi_fini(
259227569Sphilip	__in		efx_nic_t *enp);
260227569Sphilip
261227569Sphilip#endif	/* EFSYS_OPT_MCDI */
262227569Sphilip
263227569Sphilip/* INTR */
264227569Sphilip
265227569Sphilip#define	EFX_NINTR_FALCON 64
266227569Sphilip#define	EFX_NINTR_SIENA 1024
267227569Sphilip
268227569Sphiliptypedef enum efx_intr_type_e {
269227569Sphilip	EFX_INTR_INVALID = 0,
270227569Sphilip	EFX_INTR_LINE,
271227569Sphilip	EFX_INTR_MESSAGE,
272227569Sphilip	EFX_INTR_NTYPES
273227569Sphilip} efx_intr_type_t;
274227569Sphilip
275227569Sphilip#define	EFX_INTR_SIZE	(sizeof (efx_oword_t))
276227569Sphilip
277293927Sarybchikextern	__checkReturn	efx_rc_t
278227569Sphilipefx_intr_init(
279227569Sphilip	__in		efx_nic_t *enp,
280227569Sphilip	__in		efx_intr_type_t type,
281227569Sphilip	__in		efsys_mem_t *esmp);
282227569Sphilip
283227569Sphilipextern 			void
284227569Sphilipefx_intr_enable(
285227569Sphilip	__in		efx_nic_t *enp);
286227569Sphilip
287227569Sphilipextern 			void
288227569Sphilipefx_intr_disable(
289227569Sphilip	__in		efx_nic_t *enp);
290227569Sphilip
291227569Sphilipextern 			void
292227569Sphilipefx_intr_disable_unlocked(
293227569Sphilip	__in		efx_nic_t *enp);
294227569Sphilip
295227569Sphilip#define	EFX_INTR_NEVQS	32
296227569Sphilip
297293927Sarybchikextern __checkReturn	efx_rc_t
298227569Sphilipefx_intr_trigger(
299227569Sphilip	__in		efx_nic_t *enp,
300227569Sphilip	__in		unsigned int level);
301227569Sphilip
302227569Sphilipextern			void
303227569Sphilipefx_intr_status_line(
304227569Sphilip	__in		efx_nic_t *enp,
305227569Sphilip	__out		boolean_t *fatalp,
306227569Sphilip	__out		uint32_t *maskp);
307227569Sphilip
308227569Sphilipextern			void
309227569Sphilipefx_intr_status_message(
310227569Sphilip	__in		efx_nic_t *enp,
311227569Sphilip	__in		unsigned int message,
312227569Sphilip	__out		boolean_t *fatalp);
313227569Sphilip
314227569Sphilipextern			void
315227569Sphilipefx_intr_fatal(
316227569Sphilip	__in		efx_nic_t *enp);
317227569Sphilip
318227569Sphilipextern			void
319227569Sphilipefx_intr_fini(
320227569Sphilip	__in		efx_nic_t *enp);
321227569Sphilip
322227569Sphilip/* MAC */
323227569Sphilip
324227569Sphilip#if EFSYS_OPT_MAC_STATS
325227569Sphilip
326284555Sarybchik/* START MKCONFIG GENERATED EfxHeaderMacBlock e323546097fd7c65 */
327227569Sphiliptypedef enum efx_mac_stat_e {
328227569Sphilip	EFX_MAC_RX_OCTETS,
329227569Sphilip	EFX_MAC_RX_PKTS,
330227569Sphilip	EFX_MAC_RX_UNICST_PKTS,
331227569Sphilip	EFX_MAC_RX_MULTICST_PKTS,
332227569Sphilip	EFX_MAC_RX_BRDCST_PKTS,
333227569Sphilip	EFX_MAC_RX_PAUSE_PKTS,
334227569Sphilip	EFX_MAC_RX_LE_64_PKTS,
335227569Sphilip	EFX_MAC_RX_65_TO_127_PKTS,
336227569Sphilip	EFX_MAC_RX_128_TO_255_PKTS,
337227569Sphilip	EFX_MAC_RX_256_TO_511_PKTS,
338227569Sphilip	EFX_MAC_RX_512_TO_1023_PKTS,
339227569Sphilip	EFX_MAC_RX_1024_TO_15XX_PKTS,
340227569Sphilip	EFX_MAC_RX_GE_15XX_PKTS,
341227569Sphilip	EFX_MAC_RX_ERRORS,
342227569Sphilip	EFX_MAC_RX_FCS_ERRORS,
343227569Sphilip	EFX_MAC_RX_DROP_EVENTS,
344227569Sphilip	EFX_MAC_RX_FALSE_CARRIER_ERRORS,
345227569Sphilip	EFX_MAC_RX_SYMBOL_ERRORS,
346227569Sphilip	EFX_MAC_RX_ALIGN_ERRORS,
347227569Sphilip	EFX_MAC_RX_INTERNAL_ERRORS,
348227569Sphilip	EFX_MAC_RX_JABBER_PKTS,
349227569Sphilip	EFX_MAC_RX_LANE0_CHAR_ERR,
350227569Sphilip	EFX_MAC_RX_LANE1_CHAR_ERR,
351227569Sphilip	EFX_MAC_RX_LANE2_CHAR_ERR,
352227569Sphilip	EFX_MAC_RX_LANE3_CHAR_ERR,
353227569Sphilip	EFX_MAC_RX_LANE0_DISP_ERR,
354227569Sphilip	EFX_MAC_RX_LANE1_DISP_ERR,
355227569Sphilip	EFX_MAC_RX_LANE2_DISP_ERR,
356227569Sphilip	EFX_MAC_RX_LANE3_DISP_ERR,
357227569Sphilip	EFX_MAC_RX_MATCH_FAULT,
358227569Sphilip	EFX_MAC_RX_NODESC_DROP_CNT,
359227569Sphilip	EFX_MAC_TX_OCTETS,
360227569Sphilip	EFX_MAC_TX_PKTS,
361227569Sphilip	EFX_MAC_TX_UNICST_PKTS,
362227569Sphilip	EFX_MAC_TX_MULTICST_PKTS,
363227569Sphilip	EFX_MAC_TX_BRDCST_PKTS,
364227569Sphilip	EFX_MAC_TX_PAUSE_PKTS,
365227569Sphilip	EFX_MAC_TX_LE_64_PKTS,
366227569Sphilip	EFX_MAC_TX_65_TO_127_PKTS,
367227569Sphilip	EFX_MAC_TX_128_TO_255_PKTS,
368227569Sphilip	EFX_MAC_TX_256_TO_511_PKTS,
369227569Sphilip	EFX_MAC_TX_512_TO_1023_PKTS,
370227569Sphilip	EFX_MAC_TX_1024_TO_15XX_PKTS,
371227569Sphilip	EFX_MAC_TX_GE_15XX_PKTS,
372227569Sphilip	EFX_MAC_TX_ERRORS,
373227569Sphilip	EFX_MAC_TX_SGL_COL_PKTS,
374227569Sphilip	EFX_MAC_TX_MULT_COL_PKTS,
375227569Sphilip	EFX_MAC_TX_EX_COL_PKTS,
376227569Sphilip	EFX_MAC_TX_LATE_COL_PKTS,
377227569Sphilip	EFX_MAC_TX_DEF_PKTS,
378227569Sphilip	EFX_MAC_TX_EX_DEF_PKTS,
379284555Sarybchik	EFX_MAC_PM_TRUNC_BB_OVERFLOW,
380284555Sarybchik	EFX_MAC_PM_DISCARD_BB_OVERFLOW,
381284555Sarybchik	EFX_MAC_PM_TRUNC_VFIFO_FULL,
382284555Sarybchik	EFX_MAC_PM_DISCARD_VFIFO_FULL,
383284555Sarybchik	EFX_MAC_PM_TRUNC_QBB,
384284555Sarybchik	EFX_MAC_PM_DISCARD_QBB,
385284555Sarybchik	EFX_MAC_PM_DISCARD_MAPPING,
386284555Sarybchik	EFX_MAC_RXDP_Q_DISABLED_PKTS,
387284555Sarybchik	EFX_MAC_RXDP_DI_DROPPED_PKTS,
388284555Sarybchik	EFX_MAC_RXDP_STREAMING_PKTS,
389284555Sarybchik	EFX_MAC_RXDP_HLB_FETCH,
390284555Sarybchik	EFX_MAC_RXDP_HLB_WAIT,
391284555Sarybchik	EFX_MAC_VADAPTER_RX_UNICAST_PACKETS,
392284555Sarybchik	EFX_MAC_VADAPTER_RX_UNICAST_BYTES,
393284555Sarybchik	EFX_MAC_VADAPTER_RX_MULTICAST_PACKETS,
394284555Sarybchik	EFX_MAC_VADAPTER_RX_MULTICAST_BYTES,
395284555Sarybchik	EFX_MAC_VADAPTER_RX_BROADCAST_PACKETS,
396284555Sarybchik	EFX_MAC_VADAPTER_RX_BROADCAST_BYTES,
397284555Sarybchik	EFX_MAC_VADAPTER_RX_BAD_PACKETS,
398284555Sarybchik	EFX_MAC_VADAPTER_RX_BAD_BYTES,
399284555Sarybchik	EFX_MAC_VADAPTER_RX_OVERFLOW,
400284555Sarybchik	EFX_MAC_VADAPTER_TX_UNICAST_PACKETS,
401284555Sarybchik	EFX_MAC_VADAPTER_TX_UNICAST_BYTES,
402284555Sarybchik	EFX_MAC_VADAPTER_TX_MULTICAST_PACKETS,
403284555Sarybchik	EFX_MAC_VADAPTER_TX_MULTICAST_BYTES,
404284555Sarybchik	EFX_MAC_VADAPTER_TX_BROADCAST_PACKETS,
405284555Sarybchik	EFX_MAC_VADAPTER_TX_BROADCAST_BYTES,
406284555Sarybchik	EFX_MAC_VADAPTER_TX_BAD_PACKETS,
407284555Sarybchik	EFX_MAC_VADAPTER_TX_BAD_BYTES,
408284555Sarybchik	EFX_MAC_VADAPTER_TX_OVERFLOW,
409227569Sphilip	EFX_MAC_NSTATS
410227569Sphilip} efx_mac_stat_t;
411227569Sphilip
412227569Sphilip/* END MKCONFIG GENERATED EfxHeaderMacBlock */
413227569Sphilip
414227569Sphilip#endif	/* EFSYS_OPT_MAC_STATS */
415227569Sphilip
416227569Sphiliptypedef enum efx_link_mode_e {
417227569Sphilip	EFX_LINK_UNKNOWN = 0,
418227569Sphilip	EFX_LINK_DOWN,
419227569Sphilip	EFX_LINK_10HDX,
420227569Sphilip	EFX_LINK_10FDX,
421227569Sphilip	EFX_LINK_100HDX,
422227569Sphilip	EFX_LINK_100FDX,
423227569Sphilip	EFX_LINK_1000HDX,
424227569Sphilip	EFX_LINK_1000FDX,
425227569Sphilip	EFX_LINK_10000FDX,
426284555Sarybchik	EFX_LINK_40000FDX,
427227569Sphilip	EFX_LINK_NMODES
428227569Sphilip} efx_link_mode_t;
429227569Sphilip
430284555Sarybchik#define	EFX_MAC_ADDR_LEN 6
431284555Sarybchik
432284555Sarybchik#define	EFX_MAC_ADDR_IS_MULTICAST(_address) (((uint8_t*)_address)[0] & 0x01)
433284555Sarybchik
434284555Sarybchik#define	EFX_MAC_MULTICAST_LIST_MAX	256
435284555Sarybchik
436227569Sphilip#define	EFX_MAC_SDU_MAX	9202
437227569Sphilip
438227569Sphilip#define	EFX_MAC_PDU(_sdu) 				\
439227569Sphilip	P2ROUNDUP(((_sdu)				\
440227569Sphilip		    + /* EtherII */ 14			\
441227569Sphilip		    + /* VLAN */ 4			\
442227569Sphilip		    + /* CRC */ 4			\
443227569Sphilip		    + /* bug16011 */ 16),		\
444227569Sphilip		    (1 << 3))
445227569Sphilip
446227569Sphilip#define	EFX_MAC_PDU_MIN	60
447227569Sphilip#define	EFX_MAC_PDU_MAX	EFX_MAC_PDU(EFX_MAC_SDU_MAX)
448227569Sphilip
449293927Sarybchikextern	__checkReturn	efx_rc_t
450227569Sphilipefx_mac_pdu_set(
451227569Sphilip	__in		efx_nic_t *enp,
452227569Sphilip	__in		size_t pdu);
453227569Sphilip
454293927Sarybchikextern	__checkReturn	efx_rc_t
455227569Sphilipefx_mac_addr_set(
456227569Sphilip	__in		efx_nic_t *enp,
457227569Sphilip	__in		uint8_t *addr);
458227569Sphilip
459293927Sarybchikextern	__checkReturn			efx_rc_t
460284555Sarybchikefx_mac_filter_set(
461284555Sarybchik	__in				efx_nic_t *enp,
462284555Sarybchik	__in				boolean_t all_unicst,
463284555Sarybchik	__in				boolean_t mulcst,
464284555Sarybchik	__in				boolean_t all_mulcst,
465284555Sarybchik	__in				boolean_t brdcst);
466284555Sarybchik
467293927Sarybchikextern	__checkReturn	efx_rc_t
468284555Sarybchikefx_mac_multicast_list_set(
469284555Sarybchik	__in				efx_nic_t *enp,
470284555Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
471284555Sarybchik	__in				int count);
472284555Sarybchik
473293927Sarybchikextern	__checkReturn	efx_rc_t
474284555Sarybchikefx_mac_filter_default_rxq_set(
475227569Sphilip	__in		efx_nic_t *enp,
476284555Sarybchik	__in		efx_rxq_t *erp,
477284555Sarybchik	__in		boolean_t using_rss);
478227569Sphilip
479284555Sarybchikextern			void
480284555Sarybchikefx_mac_filter_default_rxq_clear(
481284555Sarybchik	__in		efx_nic_t *enp);
482284555Sarybchik
483293927Sarybchikextern	__checkReturn	efx_rc_t
484227569Sphilipefx_mac_drain(
485227569Sphilip	__in		efx_nic_t *enp,
486227569Sphilip	__in		boolean_t enabled);
487227569Sphilip
488293927Sarybchikextern	__checkReturn	efx_rc_t
489227569Sphilipefx_mac_up(
490227569Sphilip	__in		efx_nic_t *enp,
491227569Sphilip	__out		boolean_t *mac_upp);
492227569Sphilip
493227569Sphilip#define	EFX_FCNTL_RESPOND	0x00000001
494227569Sphilip#define	EFX_FCNTL_GENERATE	0x00000002
495227569Sphilip
496293927Sarybchikextern	__checkReturn	efx_rc_t
497227569Sphilipefx_mac_fcntl_set(
498227569Sphilip	__in		efx_nic_t *enp,
499227569Sphilip	__in		unsigned int fcntl,
500227569Sphilip	__in		boolean_t autoneg);
501227569Sphilip
502227569Sphilipextern			void
503227569Sphilipefx_mac_fcntl_get(
504227569Sphilip	__in		efx_nic_t *enp,
505227569Sphilip	__out		unsigned int *fcntl_wantedp,
506227569Sphilip	__out		unsigned int *fcntl_linkp);
507227569Sphilip
508227569Sphilip
509227569Sphilip#if EFSYS_OPT_MAC_STATS
510227569Sphilip
511227569Sphilip#if EFSYS_OPT_NAMES
512227569Sphilip
513284555Sarybchikextern	__checkReturn			const char *
514227569Sphilipefx_mac_stat_name(
515227569Sphilip	__in				efx_nic_t *enp,
516227569Sphilip	__in				unsigned int id);
517227569Sphilip
518227569Sphilip#endif	/* EFSYS_OPT_NAMES */
519227569Sphilip
520227569Sphilip#define	EFX_MAC_STATS_SIZE 0x400
521227569Sphilip
522227569Sphilip/*
523227569Sphilip * Upload mac statistics supported by the hardware into the given buffer.
524227569Sphilip *
525227569Sphilip * The reference buffer must be at least %EFX_MAC_STATS_SIZE bytes,
526227569Sphilip * and page aligned.
527227569Sphilip *
528227569Sphilip * The hardware will only DMA statistics that it understands (of course).
529227569Sphilip * Drivers should not make any assumptions about which statistics are
530227569Sphilip * supported, especially when the statistics are generated by firmware.
531227569Sphilip *
532227569Sphilip * Thus, drivers should zero this buffer before use, so that not-understood
533227569Sphilip * statistics read back as zero.
534227569Sphilip */
535293927Sarybchikextern	__checkReturn			efx_rc_t
536227569Sphilipefx_mac_stats_upload(
537227569Sphilip	__in				efx_nic_t *enp,
538227569Sphilip	__in				efsys_mem_t *esmp);
539227569Sphilip
540293927Sarybchikextern	__checkReturn			efx_rc_t
541227569Sphilipefx_mac_stats_periodic(
542227569Sphilip	__in				efx_nic_t *enp,
543227569Sphilip	__in				efsys_mem_t *esmp,
544227569Sphilip	__in				uint16_t period_ms,
545227569Sphilip	__in				boolean_t events);
546227569Sphilip
547293927Sarybchikextern	__checkReturn			efx_rc_t
548227569Sphilipefx_mac_stats_update(
549227569Sphilip	__in				efx_nic_t *enp,
550227569Sphilip	__in				efsys_mem_t *esmp,
551227569Sphilip	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
552293923Sarybchik	__inout_opt			uint32_t *generationp);
553227569Sphilip
554227569Sphilip#endif	/* EFSYS_OPT_MAC_STATS */
555227569Sphilip
556227569Sphilip/* MON */
557227569Sphilip
558227569Sphiliptypedef enum efx_mon_type_e {
559227569Sphilip	EFX_MON_INVALID = 0,
560227569Sphilip	EFX_MON_NULL,
561227569Sphilip	EFX_MON_LM87,
562227569Sphilip	EFX_MON_MAX6647,
563227569Sphilip	EFX_MON_SFC90X0,
564284555Sarybchik	EFX_MON_SFC91X0,
565293978Sarybchik	EFX_MON_SFC92X0,
566227569Sphilip	EFX_MON_NTYPES
567227569Sphilip} efx_mon_type_t;
568227569Sphilip
569227569Sphilip#if EFSYS_OPT_NAMES
570227569Sphilip
571284555Sarybchikextern		const char *
572227569Sphilipefx_mon_name(
573227569Sphilip	__in	efx_nic_t *enp);
574227569Sphilip
575227569Sphilip#endif	/* EFSYS_OPT_NAMES */
576227569Sphilip
577293927Sarybchikextern	__checkReturn	efx_rc_t
578227569Sphilipefx_mon_init(
579227569Sphilip	__in		efx_nic_t *enp);
580227569Sphilip
581227569Sphilip#if EFSYS_OPT_MON_STATS
582227569Sphilip
583284555Sarybchik#define	EFX_MON_STATS_PAGE_SIZE 0x100
584284555Sarybchik#define	EFX_MON_MASK_ELEMENT_SIZE 32
585227569Sphilip
586293981Sarybchik/* START MKCONFIG GENERATED MonitorHeaderStatsBlock c09b13f732431f23 */
587227569Sphiliptypedef enum efx_mon_stat_e {
588227569Sphilip	EFX_MON_STAT_2_5V,
589227569Sphilip	EFX_MON_STAT_VCCP1,
590227569Sphilip	EFX_MON_STAT_VCC,
591227569Sphilip	EFX_MON_STAT_5V,
592227569Sphilip	EFX_MON_STAT_12V,
593227569Sphilip	EFX_MON_STAT_VCCP2,
594227569Sphilip	EFX_MON_STAT_EXT_TEMP,
595227569Sphilip	EFX_MON_STAT_INT_TEMP,
596227569Sphilip	EFX_MON_STAT_AIN1,
597227569Sphilip	EFX_MON_STAT_AIN2,
598227569Sphilip	EFX_MON_STAT_INT_COOLING,
599227569Sphilip	EFX_MON_STAT_EXT_COOLING,
600227569Sphilip	EFX_MON_STAT_1V,
601227569Sphilip	EFX_MON_STAT_1_2V,
602227569Sphilip	EFX_MON_STAT_1_8V,
603227569Sphilip	EFX_MON_STAT_3_3V,
604280551Sarybchik	EFX_MON_STAT_1_2VA,
605280551Sarybchik	EFX_MON_STAT_VREF,
606280551Sarybchik	EFX_MON_STAT_VAOE,
607280551Sarybchik	EFX_MON_STAT_AOE_TEMP,
608280551Sarybchik	EFX_MON_STAT_PSU_AOE_TEMP,
609280551Sarybchik	EFX_MON_STAT_PSU_TEMP,
610280551Sarybchik	EFX_MON_STAT_FAN0,
611280551Sarybchik	EFX_MON_STAT_FAN1,
612280551Sarybchik	EFX_MON_STAT_FAN2,
613280551Sarybchik	EFX_MON_STAT_FAN3,
614280551Sarybchik	EFX_MON_STAT_FAN4,
615280551Sarybchik	EFX_MON_STAT_VAOE_IN,
616280551Sarybchik	EFX_MON_STAT_IAOE,
617280551Sarybchik	EFX_MON_STAT_IAOE_IN,
618284555Sarybchik	EFX_MON_STAT_NIC_POWER,
619284555Sarybchik	EFX_MON_STAT_0_9V,
620284555Sarybchik	EFX_MON_STAT_I0_9V,
621284555Sarybchik	EFX_MON_STAT_I1_2V,
622284555Sarybchik	EFX_MON_STAT_0_9V_ADC,
623284555Sarybchik	EFX_MON_STAT_INT_TEMP2,
624284555Sarybchik	EFX_MON_STAT_VREG_TEMP,
625284555Sarybchik	EFX_MON_STAT_VREG_0_9V_TEMP,
626284555Sarybchik	EFX_MON_STAT_VREG_1_2V_TEMP,
627284555Sarybchik	EFX_MON_STAT_INT_VPTAT,
628284555Sarybchik	EFX_MON_STAT_INT_ADC_TEMP,
629284555Sarybchik	EFX_MON_STAT_EXT_VPTAT,
630284555Sarybchik	EFX_MON_STAT_EXT_ADC_TEMP,
631284555Sarybchik	EFX_MON_STAT_AMBIENT_TEMP,
632284555Sarybchik	EFX_MON_STAT_AIRFLOW,
633284555Sarybchik	EFX_MON_STAT_VDD08D_VSS08D_CSR,
634284555Sarybchik	EFX_MON_STAT_VDD08D_VSS08D_CSR_EXTADC,
635284555Sarybchik	EFX_MON_STAT_HOTPOINT_TEMP,
636284555Sarybchik	EFX_MON_STAT_PHY_POWER_SWITCH_PORT0,
637284555Sarybchik	EFX_MON_STAT_PHY_POWER_SWITCH_PORT1,
638284555Sarybchik	EFX_MON_STAT_MUM_VCC,
639284555Sarybchik	EFX_MON_STAT_0V9_A,
640284555Sarybchik	EFX_MON_STAT_I0V9_A,
641284555Sarybchik	EFX_MON_STAT_0V9_A_TEMP,
642284555Sarybchik	EFX_MON_STAT_0V9_B,
643284555Sarybchik	EFX_MON_STAT_I0V9_B,
644284555Sarybchik	EFX_MON_STAT_0V9_B_TEMP,
645284555Sarybchik	EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY,
646284555Sarybchik	EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY_EXT_ADC,
647284555Sarybchik	EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY,
648284555Sarybchik	EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY_EXT_ADC,
649284555Sarybchik	EFX_MON_STAT_CONTROLLER_MASTER_VPTAT,
650284555Sarybchik	EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP,
651284555Sarybchik	EFX_MON_STAT_CONTROLLER_MASTER_VPTAT_EXT_ADC,
652284555Sarybchik	EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP_EXT_ADC,
653284555Sarybchik	EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT,
654284555Sarybchik	EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP,
655284555Sarybchik	EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT_EXT_ADC,
656284555Sarybchik	EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP_EXT_ADC,
657293981Sarybchik	EFX_MON_STAT_SODIMM_VOUT,
658293981Sarybchik	EFX_MON_STAT_SODIMM_0_TEMP,
659293981Sarybchik	EFX_MON_STAT_SODIMM_1_TEMP,
660293981Sarybchik	EFX_MON_STAT_PHY0_VCC,
661293981Sarybchik	EFX_MON_STAT_PHY1_VCC,
662293981Sarybchik	EFX_MON_STAT_CONTROLLER_TDIODE_TEMP,
663227569Sphilip	EFX_MON_NSTATS
664227569Sphilip} efx_mon_stat_t;
665227569Sphilip
666227569Sphilip/* END MKCONFIG GENERATED MonitorHeaderStatsBlock */
667227569Sphilip
668227569Sphiliptypedef enum efx_mon_stat_state_e {
669227569Sphilip	EFX_MON_STAT_STATE_OK = 0,
670227569Sphilip	EFX_MON_STAT_STATE_WARNING = 1,
671227569Sphilip	EFX_MON_STAT_STATE_FATAL = 2,
672227569Sphilip	EFX_MON_STAT_STATE_BROKEN = 3,
673284555Sarybchik	EFX_MON_STAT_STATE_NO_READING = 4,
674227569Sphilip} efx_mon_stat_state_t;
675227569Sphilip
676284555Sarybchiktypedef struct efx_mon_stat_value_s {
677227569Sphilip	uint16_t	emsv_value;
678227569Sphilip	uint16_t	emsv_state;
679227569Sphilip} efx_mon_stat_value_t;
680227569Sphilip
681227569Sphilip#if EFSYS_OPT_NAMES
682227569Sphilip
683284555Sarybchikextern					const char *
684227569Sphilipefx_mon_stat_name(
685227569Sphilip	__in				efx_nic_t *enp,
686227569Sphilip	__in				efx_mon_stat_t id);
687227569Sphilip
688227569Sphilip#endif	/* EFSYS_OPT_NAMES */
689227569Sphilip
690293927Sarybchikextern	__checkReturn			efx_rc_t
691227569Sphilipefx_mon_stats_update(
692227569Sphilip	__in				efx_nic_t *enp,
693227569Sphilip	__in				efsys_mem_t *esmp,
694293921Sarybchik	__inout_ecount(EFX_MON_NSTATS)	efx_mon_stat_value_t *values);
695227569Sphilip
696227569Sphilip#endif	/* EFSYS_OPT_MON_STATS */
697227569Sphilip
698227569Sphilipextern		void
699227569Sphilipefx_mon_fini(
700227569Sphilip	__in	efx_nic_t *enp);
701227569Sphilip
702227569Sphilip/* PHY */
703227569Sphilip
704227569Sphilip#define	PMA_PMD_MMD	1
705227569Sphilip#define	PCS_MMD		3
706227569Sphilip#define	PHY_XS_MMD	4
707227569Sphilip#define	DTE_XS_MMD	5
708227569Sphilip#define	AN_MMD		7
709227569Sphilip#define	CL22EXT_MMD	29
710227569Sphilip
711227569Sphilip#define	MAXMMD		((1 << 5) - 1)
712227569Sphilip
713293927Sarybchikextern	__checkReturn	efx_rc_t
714227569Sphilipefx_phy_verify(
715227569Sphilip	__in		efx_nic_t *enp);
716227569Sphilip
717227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL
718227569Sphilip
719227569Sphiliptypedef enum efx_phy_led_mode_e {
720227569Sphilip	EFX_PHY_LED_DEFAULT = 0,
721227569Sphilip	EFX_PHY_LED_OFF,
722227569Sphilip	EFX_PHY_LED_ON,
723227569Sphilip	EFX_PHY_LED_FLASH,
724227569Sphilip	EFX_PHY_LED_NMODES
725227569Sphilip} efx_phy_led_mode_t;
726227569Sphilip
727293927Sarybchikextern	__checkReturn	efx_rc_t
728227569Sphilipefx_phy_led_set(
729227569Sphilip	__in	efx_nic_t *enp,
730227569Sphilip	__in	efx_phy_led_mode_t mode);
731227569Sphilip
732227569Sphilip#endif	/* EFSYS_OPT_PHY_LED_CONTROL */
733227569Sphilip
734293927Sarybchikextern	__checkReturn	efx_rc_t
735227569Sphilipefx_port_init(
736227569Sphilip	__in		efx_nic_t *enp);
737227569Sphilip
738227569Sphilip#if EFSYS_OPT_LOOPBACK
739227569Sphilip
740227569Sphiliptypedef enum efx_loopback_type_e {
741227569Sphilip	EFX_LOOPBACK_OFF = 0,
742227569Sphilip	EFX_LOOPBACK_DATA = 1,
743227569Sphilip	EFX_LOOPBACK_GMAC = 2,
744227569Sphilip	EFX_LOOPBACK_XGMII = 3,
745227569Sphilip	EFX_LOOPBACK_XGXS = 4,
746227569Sphilip	EFX_LOOPBACK_XAUI = 5,
747227569Sphilip	EFX_LOOPBACK_GMII = 6,
748227569Sphilip	EFX_LOOPBACK_SGMII = 7,
749227569Sphilip	EFX_LOOPBACK_XGBR = 8,
750227569Sphilip	EFX_LOOPBACK_XFI = 9,
751227569Sphilip	EFX_LOOPBACK_XAUI_FAR = 10,
752227569Sphilip	EFX_LOOPBACK_GMII_FAR = 11,
753227569Sphilip	EFX_LOOPBACK_SGMII_FAR = 12,
754227569Sphilip	EFX_LOOPBACK_XFI_FAR = 13,
755227569Sphilip	EFX_LOOPBACK_GPHY = 14,
756227569Sphilip	EFX_LOOPBACK_PHY_XS = 15,
757227569Sphilip	EFX_LOOPBACK_PCS = 16,
758227569Sphilip	EFX_LOOPBACK_PMA_PMD = 17,
759284555Sarybchik	EFX_LOOPBACK_XPORT = 18,
760284555Sarybchik	EFX_LOOPBACK_XGMII_WS = 19,
761284555Sarybchik	EFX_LOOPBACK_XAUI_WS = 20,
762284555Sarybchik	EFX_LOOPBACK_XAUI_WS_FAR = 21,
763284555Sarybchik	EFX_LOOPBACK_XAUI_WS_NEAR = 22,
764284555Sarybchik	EFX_LOOPBACK_GMII_WS = 23,
765284555Sarybchik	EFX_LOOPBACK_XFI_WS = 24,
766284555Sarybchik	EFX_LOOPBACK_XFI_WS_FAR = 25,
767284555Sarybchik	EFX_LOOPBACK_PHYXS_WS = 26,
768284555Sarybchik	EFX_LOOPBACK_PMA_INT = 27,
769284555Sarybchik	EFX_LOOPBACK_SD_NEAR = 28,
770284555Sarybchik	EFX_LOOPBACK_SD_FAR = 29,
771284555Sarybchik	EFX_LOOPBACK_PMA_INT_WS = 30,
772284555Sarybchik	EFX_LOOPBACK_SD_FEP2_WS = 31,
773284555Sarybchik	EFX_LOOPBACK_SD_FEP1_5_WS = 32,
774284555Sarybchik	EFX_LOOPBACK_SD_FEP_WS = 33,
775284555Sarybchik	EFX_LOOPBACK_SD_FES_WS = 34,
776227569Sphilip	EFX_LOOPBACK_NTYPES
777227569Sphilip} efx_loopback_type_t;
778227569Sphilip
779284555Sarybchiktypedef enum efx_loopback_kind_e {
780284555Sarybchik	EFX_LOOPBACK_KIND_OFF = 0,
781284555Sarybchik	EFX_LOOPBACK_KIND_ALL,
782284555Sarybchik	EFX_LOOPBACK_KIND_MAC,
783284555Sarybchik	EFX_LOOPBACK_KIND_PHY,
784284555Sarybchik	EFX_LOOPBACK_NKINDS
785284555Sarybchik} efx_loopback_kind_t;
786227569Sphilip
787284555Sarybchikextern			void
788284555Sarybchikefx_loopback_mask(
789284555Sarybchik	__in	efx_loopback_kind_t loopback_kind,
790284555Sarybchik	__out	efx_qword_t *maskp);
791227569Sphilip
792293927Sarybchikextern	__checkReturn	efx_rc_t
793227569Sphilipefx_port_loopback_set(
794227569Sphilip	__in	efx_nic_t *enp,
795227569Sphilip	__in	efx_link_mode_t link_mode,
796227569Sphilip	__in	efx_loopback_type_t type);
797227569Sphilip
798227569Sphilip#if EFSYS_OPT_NAMES
799227569Sphilip
800284555Sarybchikextern	__checkReturn	const char *
801227569Sphilipefx_loopback_type_name(
802227569Sphilip	__in		efx_nic_t *enp,
803227569Sphilip	__in		efx_loopback_type_t type);
804227569Sphilip
805227569Sphilip#endif	/* EFSYS_OPT_NAMES */
806227569Sphilip
807227569Sphilip#endif	/* EFSYS_OPT_LOOPBACK */
808227569Sphilip
809293927Sarybchikextern	__checkReturn	efx_rc_t
810227569Sphilipefx_port_poll(
811227569Sphilip	__in		efx_nic_t *enp,
812284555Sarybchik	__out_opt	efx_link_mode_t	*link_modep);
813227569Sphilip
814227569Sphilipextern 		void
815227569Sphilipefx_port_fini(
816227569Sphilip	__in	efx_nic_t *enp);
817227569Sphilip
818227569Sphiliptypedef enum efx_phy_cap_type_e {
819227569Sphilip	EFX_PHY_CAP_INVALID = 0,
820227569Sphilip	EFX_PHY_CAP_10HDX,
821227569Sphilip	EFX_PHY_CAP_10FDX,
822227569Sphilip	EFX_PHY_CAP_100HDX,
823227569Sphilip	EFX_PHY_CAP_100FDX,
824227569Sphilip	EFX_PHY_CAP_1000HDX,
825227569Sphilip	EFX_PHY_CAP_1000FDX,
826227569Sphilip	EFX_PHY_CAP_10000FDX,
827227569Sphilip	EFX_PHY_CAP_PAUSE,
828227569Sphilip	EFX_PHY_CAP_ASYM,
829227569Sphilip	EFX_PHY_CAP_AN,
830284555Sarybchik	EFX_PHY_CAP_40000FDX,
831227569Sphilip	EFX_PHY_CAP_NTYPES
832227569Sphilip} efx_phy_cap_type_t;
833227569Sphilip
834227569Sphilip
835227569Sphilip#define	EFX_PHY_CAP_CURRENT	0x00000000
836227569Sphilip#define	EFX_PHY_CAP_DEFAULT	0x00000001
837227569Sphilip#define	EFX_PHY_CAP_PERM	0x00000002
838227569Sphilip
839227569Sphilipextern		void
840227569Sphilipefx_phy_adv_cap_get(
841227569Sphilip	__in		efx_nic_t *enp,
842227569Sphilip	__in            uint32_t flag,
843227569Sphilip	__out		uint32_t *maskp);
844227569Sphilip
845293927Sarybchikextern	__checkReturn	efx_rc_t
846227569Sphilipefx_phy_adv_cap_set(
847227569Sphilip	__in		efx_nic_t *enp,
848227569Sphilip	__in		uint32_t mask);
849227569Sphilip
850227569Sphilipextern			void
851227569Sphilipefx_phy_lp_cap_get(
852227569Sphilip	__in		efx_nic_t *enp,
853227569Sphilip	__out		uint32_t *maskp);
854227569Sphilip
855293927Sarybchikextern	__checkReturn	efx_rc_t
856227569Sphilipefx_phy_oui_get(
857227569Sphilip	__in		efx_nic_t *enp,
858227569Sphilip	__out		uint32_t *ouip);
859227569Sphilip
860227569Sphiliptypedef enum efx_phy_media_type_e {
861227569Sphilip	EFX_PHY_MEDIA_INVALID = 0,
862227569Sphilip	EFX_PHY_MEDIA_XAUI,
863227569Sphilip	EFX_PHY_MEDIA_CX4,
864227569Sphilip	EFX_PHY_MEDIA_KX4,
865227569Sphilip	EFX_PHY_MEDIA_XFP,
866227569Sphilip	EFX_PHY_MEDIA_SFP_PLUS,
867227569Sphilip	EFX_PHY_MEDIA_BASE_T,
868284555Sarybchik	EFX_PHY_MEDIA_QSFP_PLUS,
869227569Sphilip	EFX_PHY_MEDIA_NTYPES
870227569Sphilip} efx_phy_media_type_t;
871227569Sphilip
872227569Sphilip/* Get the type of medium currently used.  If the board has ports for
873227569Sphilip * modules, a module is present, and we recognise the media type of
874227569Sphilip * the module, then this will be the media type of the module.
875227569Sphilip * Otherwise it will be the media type of the port.
876227569Sphilip */
877227569Sphilipextern			void
878227569Sphilipefx_phy_media_type_get(
879227569Sphilip	__in		efx_nic_t *enp,
880227569Sphilip	__out		efx_phy_media_type_t *typep);
881227569Sphilip
882295526Sarybchikextern					efx_rc_t
883295526Sarybchikefx_phy_module_get_info(
884295526Sarybchik	__in				efx_nic_t *enp,
885295526Sarybchik	__in				uint8_t dev_addr,
886295526Sarybchik	__in				uint8_t offset,
887295526Sarybchik	__in				uint8_t len,
888295526Sarybchik	__out_bcount(len)		uint8_t *data);
889295526Sarybchik
890227569Sphilip#if EFSYS_OPT_PHY_STATS
891227569Sphilip
892227569Sphilip/* START MKCONFIG GENERATED PhyHeaderStatsBlock 30ed56ad501f8e36 */
893227569Sphiliptypedef enum efx_phy_stat_e {
894227569Sphilip	EFX_PHY_STAT_OUI,
895227569Sphilip	EFX_PHY_STAT_PMA_PMD_LINK_UP,
896227569Sphilip	EFX_PHY_STAT_PMA_PMD_RX_FAULT,
897227569Sphilip	EFX_PHY_STAT_PMA_PMD_TX_FAULT,
898227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_A,
899227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_B,
900227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_C,
901227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_D,
902227569Sphilip	EFX_PHY_STAT_PCS_LINK_UP,
903227569Sphilip	EFX_PHY_STAT_PCS_RX_FAULT,
904227569Sphilip	EFX_PHY_STAT_PCS_TX_FAULT,
905227569Sphilip	EFX_PHY_STAT_PCS_BER,
906227569Sphilip	EFX_PHY_STAT_PCS_BLOCK_ERRORS,
907227569Sphilip	EFX_PHY_STAT_PHY_XS_LINK_UP,
908227569Sphilip	EFX_PHY_STAT_PHY_XS_RX_FAULT,
909227569Sphilip	EFX_PHY_STAT_PHY_XS_TX_FAULT,
910227569Sphilip	EFX_PHY_STAT_PHY_XS_ALIGN,
911227569Sphilip	EFX_PHY_STAT_PHY_XS_SYNC_A,
912227569Sphilip	EFX_PHY_STAT_PHY_XS_SYNC_B,
913227569Sphilip	EFX_PHY_STAT_PHY_XS_SYNC_C,
914227569Sphilip	EFX_PHY_STAT_PHY_XS_SYNC_D,
915227569Sphilip	EFX_PHY_STAT_AN_LINK_UP,
916227569Sphilip	EFX_PHY_STAT_AN_MASTER,
917227569Sphilip	EFX_PHY_STAT_AN_LOCAL_RX_OK,
918227569Sphilip	EFX_PHY_STAT_AN_REMOTE_RX_OK,
919227569Sphilip	EFX_PHY_STAT_CL22EXT_LINK_UP,
920227569Sphilip	EFX_PHY_STAT_SNR_A,
921227569Sphilip	EFX_PHY_STAT_SNR_B,
922227569Sphilip	EFX_PHY_STAT_SNR_C,
923227569Sphilip	EFX_PHY_STAT_SNR_D,
924227569Sphilip	EFX_PHY_STAT_PMA_PMD_SIGNAL_A,
925227569Sphilip	EFX_PHY_STAT_PMA_PMD_SIGNAL_B,
926227569Sphilip	EFX_PHY_STAT_PMA_PMD_SIGNAL_C,
927227569Sphilip	EFX_PHY_STAT_PMA_PMD_SIGNAL_D,
928227569Sphilip	EFX_PHY_STAT_AN_COMPLETE,
929227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_MAJOR,
930227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_MINOR,
931227569Sphilip	EFX_PHY_STAT_PMA_PMD_REV_MICRO,
932227569Sphilip	EFX_PHY_STAT_PCS_FW_VERSION_0,
933227569Sphilip	EFX_PHY_STAT_PCS_FW_VERSION_1,
934227569Sphilip	EFX_PHY_STAT_PCS_FW_VERSION_2,
935227569Sphilip	EFX_PHY_STAT_PCS_FW_VERSION_3,
936227569Sphilip	EFX_PHY_STAT_PCS_FW_BUILD_YY,
937227569Sphilip	EFX_PHY_STAT_PCS_FW_BUILD_MM,
938227569Sphilip	EFX_PHY_STAT_PCS_FW_BUILD_DD,
939227569Sphilip	EFX_PHY_STAT_PCS_OP_MODE,
940227569Sphilip	EFX_PHY_NSTATS
941227569Sphilip} efx_phy_stat_t;
942227569Sphilip
943227569Sphilip/* END MKCONFIG GENERATED PhyHeaderStatsBlock */
944227569Sphilip
945227569Sphilip#if EFSYS_OPT_NAMES
946227569Sphilip
947284555Sarybchikextern					const char *
948227569Sphilipefx_phy_stat_name(
949227569Sphilip	__in				efx_nic_t *enp,
950227569Sphilip	__in				efx_phy_stat_t stat);
951227569Sphilip
952227569Sphilip#endif	/* EFSYS_OPT_NAMES */
953227569Sphilip
954227569Sphilip#define	EFX_PHY_STATS_SIZE 0x100
955227569Sphilip
956293927Sarybchikextern	__checkReturn			efx_rc_t
957227569Sphilipefx_phy_stats_update(
958227569Sphilip	__in				efx_nic_t *enp,
959227569Sphilip	__in				efsys_mem_t *esmp,
960293921Sarybchik	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
961227569Sphilip
962227569Sphilip#endif	/* EFSYS_OPT_PHY_STATS */
963227569Sphilip
964227569Sphilip#if EFSYS_OPT_PHY_PROPS
965227569Sphilip
966227569Sphilip#if EFSYS_OPT_NAMES
967227569Sphilip
968284555Sarybchikextern		const char *
969227569Sphilipefx_phy_prop_name(
970227569Sphilip	__in	efx_nic_t *enp,
971227569Sphilip	__in	unsigned int id);
972227569Sphilip
973227569Sphilip#endif	/* EFSYS_OPT_NAMES */
974227569Sphilip
975227569Sphilip#define	EFX_PHY_PROP_DEFAULT	0x00000001
976227569Sphilip
977293927Sarybchikextern	__checkReturn	efx_rc_t
978227569Sphilipefx_phy_prop_get(
979227569Sphilip	__in		efx_nic_t *enp,
980227569Sphilip	__in		unsigned int id,
981227569Sphilip	__in		uint32_t flags,
982227569Sphilip	__out		uint32_t *valp);
983227569Sphilip
984293927Sarybchikextern	__checkReturn	efx_rc_t
985227569Sphilipefx_phy_prop_set(
986227569Sphilip	__in		efx_nic_t *enp,
987227569Sphilip	__in		unsigned int id,
988227569Sphilip	__in		uint32_t val);
989227569Sphilip
990227569Sphilip#endif	/* EFSYS_OPT_PHY_PROPS */
991227569Sphilip
992284555Sarybchik#if EFSYS_OPT_BIST
993227569Sphilip
994284555Sarybchiktypedef enum efx_bist_type_e {
995284555Sarybchik	EFX_BIST_TYPE_UNKNOWN,
996284555Sarybchik	EFX_BIST_TYPE_PHY_NORMAL,
997284555Sarybchik	EFX_BIST_TYPE_PHY_CABLE_SHORT,
998284555Sarybchik	EFX_BIST_TYPE_PHY_CABLE_LONG,
999284555Sarybchik	EFX_BIST_TYPE_MC_MEM,	/* Test the MC DMEM and IMEM */
1000284555Sarybchik	EFX_BIST_TYPE_SAT_MEM,	/* Test the DMEM and IMEM of satellite cpus*/
1001284555Sarybchik	EFX_BIST_TYPE_REG,	/* Test the register memories */
1002284555Sarybchik	EFX_BIST_TYPE_NTYPES,
1003284555Sarybchik} efx_bist_type_t;
1004227569Sphilip
1005284555Sarybchiktypedef enum efx_bist_result_e {
1006284555Sarybchik	EFX_BIST_RESULT_UNKNOWN,
1007284555Sarybchik	EFX_BIST_RESULT_RUNNING,
1008284555Sarybchik	EFX_BIST_RESULT_PASSED,
1009284555Sarybchik	EFX_BIST_RESULT_FAILED,
1010284555Sarybchik} efx_bist_result_t;
1011227569Sphilip
1012227569Sphiliptypedef enum efx_phy_cable_status_e {
1013227569Sphilip	EFX_PHY_CABLE_STATUS_OK,
1014227569Sphilip	EFX_PHY_CABLE_STATUS_INVALID,
1015227569Sphilip	EFX_PHY_CABLE_STATUS_OPEN,
1016227569Sphilip	EFX_PHY_CABLE_STATUS_INTRAPAIRSHORT,
1017227569Sphilip	EFX_PHY_CABLE_STATUS_INTERPAIRSHORT,
1018227569Sphilip	EFX_PHY_CABLE_STATUS_BUSY,
1019227569Sphilip} efx_phy_cable_status_t;
1020227569Sphilip
1021284555Sarybchiktypedef enum efx_bist_value_e {
1022284555Sarybchik	EFX_BIST_PHY_CABLE_LENGTH_A,
1023284555Sarybchik	EFX_BIST_PHY_CABLE_LENGTH_B,
1024284555Sarybchik	EFX_BIST_PHY_CABLE_LENGTH_C,
1025284555Sarybchik	EFX_BIST_PHY_CABLE_LENGTH_D,
1026284555Sarybchik	EFX_BIST_PHY_CABLE_STATUS_A,
1027284555Sarybchik	EFX_BIST_PHY_CABLE_STATUS_B,
1028284555Sarybchik	EFX_BIST_PHY_CABLE_STATUS_C,
1029284555Sarybchik	EFX_BIST_PHY_CABLE_STATUS_D,
1030284555Sarybchik	EFX_BIST_FAULT_CODE,
1031284555Sarybchik	/* Memory BIST specific values. These match to the MC_CMD_BIST_POLL
1032284555Sarybchik	 * response. */
1033284555Sarybchik	EFX_BIST_MEM_TEST,
1034284555Sarybchik	EFX_BIST_MEM_ADDR,
1035284555Sarybchik	EFX_BIST_MEM_BUS,
1036284555Sarybchik	EFX_BIST_MEM_EXPECT,
1037284555Sarybchik	EFX_BIST_MEM_ACTUAL,
1038284555Sarybchik	EFX_BIST_MEM_ECC,
1039284555Sarybchik	EFX_BIST_MEM_ECC_PARITY,
1040284555Sarybchik	EFX_BIST_MEM_ECC_FATAL,
1041284555Sarybchik	EFX_BIST_NVALUES,
1042284555Sarybchik} efx_bist_value_t;
1043227569Sphilip
1044293927Sarybchikextern	__checkReturn		efx_rc_t
1045284555Sarybchikefx_bist_enable_offline(
1046284555Sarybchik	__in			efx_nic_t *enp);
1047284555Sarybchik
1048293927Sarybchikextern	__checkReturn		efx_rc_t
1049284555Sarybchikefx_bist_start(
1050227569Sphilip	__in			efx_nic_t *enp,
1051284555Sarybchik	__in			efx_bist_type_t type);
1052227569Sphilip
1053293927Sarybchikextern	__checkReturn		efx_rc_t
1054284555Sarybchikefx_bist_poll(
1055227569Sphilip	__in			efx_nic_t *enp,
1056284555Sarybchik	__in			efx_bist_type_t type,
1057284555Sarybchik	__out			efx_bist_result_t *resultp,
1058227569Sphilip	__out_opt		uint32_t *value_maskp,
1059227569Sphilip	__out_ecount_opt(count)	unsigned long *valuesp,
1060227569Sphilip	__in			size_t count);
1061227569Sphilip
1062227569Sphilipextern				void
1063284555Sarybchikefx_bist_stop(
1064227569Sphilip	__in			efx_nic_t *enp,
1065284555Sarybchik	__in			efx_bist_type_t type);
1066227569Sphilip
1067284555Sarybchik#endif	/* EFSYS_OPT_BIST */
1068227569Sphilip
1069227569Sphilip#define	EFX_FEATURE_IPV6		0x00000001
1070227569Sphilip#define	EFX_FEATURE_LFSR_HASH_INSERT	0x00000002
1071227569Sphilip#define	EFX_FEATURE_LINK_EVENTS		0x00000004
1072227569Sphilip#define	EFX_FEATURE_PERIODIC_MAC_STATS	0x00000008
1073227569Sphilip#define	EFX_FEATURE_WOL			0x00000010
1074227569Sphilip#define	EFX_FEATURE_MCDI		0x00000020
1075227569Sphilip#define	EFX_FEATURE_LOOKAHEAD_SPLIT	0x00000040
1076227569Sphilip#define	EFX_FEATURE_MAC_HEADER_FILTERS	0x00000080
1077280550Sarybchik#define	EFX_FEATURE_TURBO		0x00000100
1078284555Sarybchik#define	EFX_FEATURE_MCDI_DMA		0x00000200
1079284555Sarybchik#define	EFX_FEATURE_TX_SRC_FILTERS	0x00000400
1080284555Sarybchik#define	EFX_FEATURE_PIO_BUFFERS		0x00000800
1081284555Sarybchik#define	EFX_FEATURE_FW_ASSISTED_TSO	0x00001000
1082294381Sarybchik#define	EFX_FEATURE_FW_ASSISTED_TSO_V2	0x00002000
1083227569Sphilip
1084227569Sphiliptypedef struct efx_nic_cfg_s {
1085227569Sphilip	uint32_t		enc_board_type;
1086227569Sphilip	uint32_t		enc_phy_type;
1087227569Sphilip#if EFSYS_OPT_NAMES
1088227569Sphilip	char			enc_phy_name[21];
1089227569Sphilip#endif
1090227569Sphilip	char			enc_phy_revision[21];
1091227569Sphilip	efx_mon_type_t		enc_mon_type;
1092227569Sphilip#if EFSYS_OPT_MON_STATS
1093284555Sarybchik	uint32_t		enc_mon_stat_dma_buf_size;
1094284555Sarybchik	uint32_t		enc_mon_stat_mask[(EFX_MON_NSTATS + 31) / 32];
1095227569Sphilip#endif
1096227569Sphilip	unsigned int		enc_features;
1097227569Sphilip	uint8_t			enc_mac_addr[6];
1098284555Sarybchik	uint8_t			enc_port;	/* PHY port number */
1099284555Sarybchik	uint32_t		enc_func_flags;
1100284555Sarybchik	uint32_t		enc_intr_vec_base;
1101284555Sarybchik	uint32_t		enc_intr_limit;
1102227569Sphilip	uint32_t		enc_evq_limit;
1103227569Sphilip	uint32_t		enc_txq_limit;
1104227569Sphilip	uint32_t		enc_rxq_limit;
1105227569Sphilip	uint32_t		enc_buftbl_limit;
1106284555Sarybchik	uint32_t		enc_piobuf_limit;
1107284555Sarybchik	uint32_t		enc_piobuf_size;
1108293983Sarybchik	uint32_t		enc_piobuf_min_alloc_size;
1109280588Sarybchik	uint32_t		enc_evq_timer_quantum_ns;
1110280588Sarybchik	uint32_t		enc_evq_timer_max_us;
1111280550Sarybchik	uint32_t		enc_clk_mult;
1112284555Sarybchik	uint32_t		enc_rx_prefix_size;
1113284555Sarybchik	uint32_t		enc_rx_buf_align_start;
1114284555Sarybchik	uint32_t		enc_rx_buf_align_end;
1115227569Sphilip#if EFSYS_OPT_LOOPBACK
1116284555Sarybchik	efx_qword_t		enc_loopback_types[EFX_LINK_NMODES];
1117227569Sphilip#endif	/* EFSYS_OPT_LOOPBACK */
1118227569Sphilip#if EFSYS_OPT_PHY_FLAGS
1119227569Sphilip	uint32_t		enc_phy_flags_mask;
1120227569Sphilip#endif	/* EFSYS_OPT_PHY_FLAGS */
1121227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL
1122227569Sphilip	uint32_t		enc_led_mask;
1123227569Sphilip#endif	/* EFSYS_OPT_PHY_LED_CONTROL */
1124227569Sphilip#if EFSYS_OPT_PHY_STATS
1125227569Sphilip	uint64_t		enc_phy_stat_mask;
1126227569Sphilip#endif	/* EFSYS_OPT_PHY_STATS */
1127227569Sphilip#if EFSYS_OPT_PHY_PROPS
1128227569Sphilip	unsigned int		enc_phy_nprops;
1129227569Sphilip#endif	/* EFSYS_OPT_PHY_PROPS */
1130227569Sphilip#if EFSYS_OPT_SIENA
1131284555Sarybchik	uint8_t			enc_mcdi_mdio_channel;
1132227569Sphilip#if EFSYS_OPT_PHY_STATS
1133284555Sarybchik	uint32_t		enc_mcdi_phy_stat_mask;
1134227569Sphilip#endif	/* EFSYS_OPT_PHY_STATS */
1135284555Sarybchik#endif /* EFSYS_OPT_SIENA */
1136293978Sarybchik#if (EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD)
1137227569Sphilip#if EFSYS_OPT_MON_STATS
1138284555Sarybchik	uint32_t		*enc_mcdi_sensor_maskp;
1139284555Sarybchik	uint32_t		enc_mcdi_sensor_mask_size;
1140227569Sphilip#endif	/* EFSYS_OPT_MON_STATS */
1141293978Sarybchik#endif	/* (EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */
1142284555Sarybchik#if EFSYS_OPT_BIST
1143227569Sphilip	uint32_t		enc_bist_mask;
1144284555Sarybchik#endif	/* EFSYS_OPT_BIST */
1145293975Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
1146284555Sarybchik	uint32_t		enc_pf;
1147284555Sarybchik	uint32_t		enc_vf;
1148284555Sarybchik	uint32_t		enc_privilege_mask;
1149293975Sarybchik#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
1150284555Sarybchik	boolean_t		enc_bug26807_workaround;
1151284555Sarybchik	boolean_t		enc_bug35388_workaround;
1152284555Sarybchik	boolean_t		enc_bug41750_workaround;
1153284555Sarybchik	boolean_t		enc_rx_batching_enabled;
1154284555Sarybchik	/* Maximum number of descriptors completed in an rx event. */
1155284555Sarybchik	uint32_t		enc_rx_batch_max;
1156284555Sarybchik        /* Number of rx descriptors the hardware requires for a push. */
1157284555Sarybchik        uint32_t		enc_rx_push_align;
1158284555Sarybchik	/*
1159284555Sarybchik	 * Maximum number of bytes into the packet the TCP header can start for
1160284555Sarybchik	 * the hardware to apply TSO packet edits.
1161284555Sarybchik	 */
1162284555Sarybchik	uint32_t                enc_tx_tso_tcp_header_offset_limit;
1163284555Sarybchik	boolean_t               enc_fw_assisted_tso_enabled;
1164294381Sarybchik	boolean_t               enc_fw_assisted_tso_v2_enabled;
1165284555Sarybchik	boolean_t               enc_hw_tx_insert_vlan_enabled;
1166284555Sarybchik	/* Datapath firmware vadapter/vport/vswitch support */
1167284555Sarybchik	boolean_t		enc_datapath_cap_evb;
1168293945Sarybchik	boolean_t               enc_rx_disable_scatter_supported;
1169293953Sarybchik	boolean_t               enc_allow_set_mac_with_installed_filters;
1170294397Sarybchik	boolean_t		enc_enhanced_set_mac_supported;
1171284555Sarybchik	/* External port identifier */
1172284555Sarybchik	uint8_t			enc_external_port;
1173293954Sarybchik	uint32_t		enc_mcdi_max_payload_length;
1174294391Sarybchik	/* VPD may be per-PF or global */
1175294391Sarybchik	boolean_t		enc_vpd_is_global;
1176227569Sphilip} efx_nic_cfg_t;
1177227569Sphilip
1178284555Sarybchik#define	EFX_PCI_FUNCTION_IS_PF(_encp)	((_encp)->enc_vf == 0xffff)
1179284555Sarybchik#define	EFX_PCI_FUNCTION_IS_VF(_encp)	((_encp)->enc_vf != 0xffff)
1180284555Sarybchik
1181284555Sarybchik#define	EFX_PCI_FUNCTION(_encp)	\
1182284555Sarybchik	(EFX_PCI_FUNCTION_IS_PF(_encp) ? (_encp)->enc_pf : (_encp)->enc_vf)
1183284555Sarybchik
1184284555Sarybchik#define	EFX_PCI_VF_PARENT(_encp)	((_encp)->enc_pf)
1185284555Sarybchik
1186227569Sphilipextern			const efx_nic_cfg_t *
1187227569Sphilipefx_nic_cfg_get(
1188227569Sphilip	__in		efx_nic_t *enp);
1189227569Sphilip
1190284555Sarybchik/* Driver resource limits (minimum required/maximum usable). */
1191284555Sarybchiktypedef struct efx_drv_limits_s
1192284555Sarybchik{
1193284555Sarybchik	uint32_t	edl_min_evq_count;
1194284555Sarybchik	uint32_t	edl_max_evq_count;
1195284555Sarybchik
1196284555Sarybchik	uint32_t	edl_min_rxq_count;
1197284555Sarybchik	uint32_t	edl_max_rxq_count;
1198284555Sarybchik
1199284555Sarybchik	uint32_t	edl_min_txq_count;
1200284555Sarybchik	uint32_t	edl_max_txq_count;
1201284555Sarybchik
1202284555Sarybchik	/* PIO blocks (sub-allocated from piobuf) */
1203284555Sarybchik	uint32_t	edl_min_pio_alloc_size;
1204284555Sarybchik	uint32_t	edl_max_pio_alloc_count;
1205284555Sarybchik} efx_drv_limits_t;
1206284555Sarybchik
1207293927Sarybchikextern	__checkReturn	efx_rc_t
1208284555Sarybchikefx_nic_set_drv_limits(
1209284555Sarybchik	__inout		efx_nic_t *enp,
1210284555Sarybchik	__in		efx_drv_limits_t *edlp);
1211284555Sarybchik
1212284555Sarybchiktypedef enum efx_nic_region_e {
1213284555Sarybchik	EFX_REGION_VI,			/* Memory BAR UC mapping */
1214284555Sarybchik	EFX_REGION_PIO_WRITE_VI,	/* Memory BAR WC mapping */
1215284555Sarybchik} efx_nic_region_t;
1216284555Sarybchik
1217293927Sarybchikextern	__checkReturn	efx_rc_t
1218284555Sarybchikefx_nic_get_bar_region(
1219284555Sarybchik	__in		efx_nic_t *enp,
1220284555Sarybchik	__in		efx_nic_region_t region,
1221284555Sarybchik	__out		uint32_t *offsetp,
1222284555Sarybchik	__out		size_t *sizep);
1223284555Sarybchik
1224293927Sarybchikextern	__checkReturn	efx_rc_t
1225284555Sarybchikefx_nic_get_vi_pool(
1226284555Sarybchik	__in		efx_nic_t *enp,
1227284555Sarybchik	__out		uint32_t *evq_countp,
1228284555Sarybchik	__out		uint32_t *rxq_countp,
1229284555Sarybchik	__out		uint32_t *txq_countp);
1230284555Sarybchik
1231284555Sarybchik
1232227569Sphilip#if EFSYS_OPT_VPD
1233227569Sphilip
1234227569Sphiliptypedef enum efx_vpd_tag_e {
1235227569Sphilip	EFX_VPD_ID = 0x02,
1236227569Sphilip	EFX_VPD_END = 0x0f,
1237227569Sphilip	EFX_VPD_RO = 0x10,
1238227569Sphilip	EFX_VPD_RW = 0x11,
1239227569Sphilip} efx_vpd_tag_t;
1240227569Sphilip
1241227569Sphiliptypedef uint16_t efx_vpd_keyword_t;
1242227569Sphilip
1243227569Sphiliptypedef struct efx_vpd_value_s {
1244227569Sphilip	efx_vpd_tag_t		evv_tag;
1245227569Sphilip	efx_vpd_keyword_t	evv_keyword;
1246227569Sphilip	uint8_t			evv_length;
1247227569Sphilip	uint8_t			evv_value[0x100];
1248227569Sphilip} efx_vpd_value_t;
1249227569Sphilip
1250227569Sphilip
1251227569Sphilip#define	EFX_VPD_KEYWORD(x, y) ((x) | ((y) << 8))
1252227569Sphilip
1253293927Sarybchikextern	__checkReturn		efx_rc_t
1254227569Sphilipefx_vpd_init(
1255227569Sphilip	__in			efx_nic_t *enp);
1256227569Sphilip
1257293927Sarybchikextern	__checkReturn		efx_rc_t
1258227569Sphilipefx_vpd_size(
1259227569Sphilip	__in			efx_nic_t *enp,
1260227569Sphilip	__out			size_t *sizep);
1261227569Sphilip
1262293927Sarybchikextern	__checkReturn		efx_rc_t
1263227569Sphilipefx_vpd_read(
1264227569Sphilip	__in			efx_nic_t *enp,
1265227569Sphilip	__out_bcount(size)	caddr_t data,
1266227569Sphilip	__in			size_t size);
1267227569Sphilip
1268293927Sarybchikextern	__checkReturn		efx_rc_t
1269227569Sphilipefx_vpd_verify(
1270227569Sphilip	__in			efx_nic_t *enp,
1271227569Sphilip	__in_bcount(size)	caddr_t data,
1272227569Sphilip	__in			size_t size);
1273227569Sphilip
1274293927Sarybchikextern  __checkReturn		efx_rc_t
1275227569Sphilipefx_vpd_reinit(
1276227569Sphilip	__in			efx_nic_t *enp,
1277227569Sphilip	__in_bcount(size)	caddr_t data,
1278227569Sphilip	__in			size_t size);
1279227569Sphilip
1280293927Sarybchikextern	__checkReturn		efx_rc_t
1281227569Sphilipefx_vpd_get(
1282227569Sphilip	__in			efx_nic_t *enp,
1283227569Sphilip	__in_bcount(size)	caddr_t data,
1284227569Sphilip	__in			size_t size,
1285227569Sphilip	__inout			efx_vpd_value_t *evvp);
1286227569Sphilip
1287293927Sarybchikextern	__checkReturn		efx_rc_t
1288227569Sphilipefx_vpd_set(
1289227569Sphilip	__in			efx_nic_t *enp,
1290227569Sphilip	__inout_bcount(size)	caddr_t data,
1291227569Sphilip	__in			size_t size,
1292227569Sphilip	__in			efx_vpd_value_t *evvp);
1293227569Sphilip
1294293927Sarybchikextern	__checkReturn		efx_rc_t
1295227569Sphilipefx_vpd_next(
1296227569Sphilip	__in			efx_nic_t *enp,
1297227569Sphilip	__inout_bcount(size)	caddr_t data,
1298227569Sphilip	__in			size_t size,
1299227569Sphilip	__out			efx_vpd_value_t *evvp,
1300227569Sphilip	__inout			unsigned int *contp);
1301227569Sphilip
1302293927Sarybchikextern __checkReturn		efx_rc_t
1303227569Sphilipefx_vpd_write(
1304227569Sphilip	__in			efx_nic_t *enp,
1305227569Sphilip	__in_bcount(size)	caddr_t data,
1306227569Sphilip	__in			size_t size);
1307227569Sphilip
1308227569Sphilipextern				void
1309227569Sphilipefx_vpd_fini(
1310227569Sphilip	__in			efx_nic_t *enp);
1311227569Sphilip
1312227569Sphilip#endif	/* EFSYS_OPT_VPD */
1313227569Sphilip
1314227569Sphilip/* NVRAM */
1315227569Sphilip
1316227569Sphilip#if EFSYS_OPT_NVRAM
1317227569Sphilip
1318227569Sphiliptypedef enum efx_nvram_type_e {
1319227569Sphilip	EFX_NVRAM_INVALID = 0,
1320227569Sphilip	EFX_NVRAM_BOOTROM,
1321227569Sphilip	EFX_NVRAM_BOOTROM_CFG,
1322227569Sphilip	EFX_NVRAM_MC_FIRMWARE,
1323227569Sphilip	EFX_NVRAM_MC_GOLDEN,
1324227569Sphilip	EFX_NVRAM_PHY,
1325227569Sphilip	EFX_NVRAM_NULLPHY,
1326280577Sarybchik	EFX_NVRAM_FPGA,
1327280577Sarybchik	EFX_NVRAM_FCFW,
1328280577Sarybchik	EFX_NVRAM_CPLD,
1329280577Sarybchik	EFX_NVRAM_FPGA_BACKUP,
1330284555Sarybchik	EFX_NVRAM_DYNAMIC_CFG,
1331294385Sarybchik	EFX_NVRAM_LICENSE,
1332227569Sphilip	EFX_NVRAM_NTYPES,
1333227569Sphilip} efx_nvram_type_t;
1334227569Sphilip
1335293927Sarybchikextern	__checkReturn		efx_rc_t
1336227569Sphilipefx_nvram_init(
1337227569Sphilip	__in			efx_nic_t *enp);
1338227569Sphilip
1339227569Sphilip#if EFSYS_OPT_DIAG
1340227569Sphilip
1341293927Sarybchikextern	__checkReturn		efx_rc_t
1342227569Sphilipefx_nvram_test(
1343227569Sphilip	__in			efx_nic_t *enp);
1344227569Sphilip
1345227569Sphilip#endif	/* EFSYS_OPT_DIAG */
1346227569Sphilip
1347293927Sarybchikextern	__checkReturn		efx_rc_t
1348227569Sphilipefx_nvram_size(
1349227569Sphilip	__in			efx_nic_t *enp,
1350227569Sphilip	__in			efx_nvram_type_t type,
1351227569Sphilip	__out			size_t *sizep);
1352227569Sphilip
1353293927Sarybchikextern	__checkReturn		efx_rc_t
1354227569Sphilipefx_nvram_rw_start(
1355227569Sphilip	__in			efx_nic_t *enp,
1356227569Sphilip	__in			efx_nvram_type_t type,
1357227569Sphilip	__out_opt		size_t *pref_chunkp);
1358227569Sphilip
1359227569Sphilipextern				void
1360227569Sphilipefx_nvram_rw_finish(
1361227569Sphilip	__in			efx_nic_t *enp,
1362227569Sphilip	__in			efx_nvram_type_t type);
1363227569Sphilip
1364293927Sarybchikextern	__checkReturn		efx_rc_t
1365227569Sphilipefx_nvram_get_version(
1366227569Sphilip	__in			efx_nic_t *enp,
1367227569Sphilip	__in			efx_nvram_type_t type,
1368227569Sphilip	__out			uint32_t *subtypep,
1369227569Sphilip	__out_ecount(4)		uint16_t version[4]);
1370227569Sphilip
1371293927Sarybchikextern	__checkReturn		efx_rc_t
1372227569Sphilipefx_nvram_read_chunk(
1373227569Sphilip	__in			efx_nic_t *enp,
1374227569Sphilip	__in			efx_nvram_type_t type,
1375227569Sphilip	__in			unsigned int offset,
1376227569Sphilip	__out_bcount(size)	caddr_t data,
1377227569Sphilip	__in			size_t size);
1378227569Sphilip
1379293927Sarybchikextern	__checkReturn		efx_rc_t
1380227569Sphilipefx_nvram_set_version(
1381227569Sphilip	__in			efx_nic_t *enp,
1382227569Sphilip	__in			efx_nvram_type_t type,
1383284555Sarybchik	__in_ecount(4)		uint16_t version[4]);
1384227569Sphilip
1385284555Sarybchik/* Validate contents of TLV formatted partition */
1386293927Sarybchikextern	__checkReturn		efx_rc_t
1387284555Sarybchikefx_nvram_tlv_validate(
1388284555Sarybchik	__in			efx_nic_t *enp,
1389284555Sarybchik	__in			uint32_t partn,
1390284555Sarybchik	__in_bcount(partn_size)	caddr_t partn_data,
1391284555Sarybchik	__in			size_t partn_size);
1392284555Sarybchik
1393293927Sarybchikextern	 __checkReturn		efx_rc_t
1394227569Sphilipefx_nvram_erase(
1395227569Sphilip	__in			efx_nic_t *enp,
1396227569Sphilip	__in			efx_nvram_type_t type);
1397227569Sphilip
1398293927Sarybchikextern	__checkReturn		efx_rc_t
1399227569Sphilipefx_nvram_write_chunk(
1400227569Sphilip	__in			efx_nic_t *enp,
1401227569Sphilip	__in			efx_nvram_type_t type,
1402227569Sphilip	__in			unsigned int offset,
1403227569Sphilip	__in_bcount(size)	caddr_t data,
1404227569Sphilip	__in			size_t size);
1405227569Sphilip
1406227569Sphilipextern				void
1407227569Sphilipefx_nvram_fini(
1408227569Sphilip	__in			efx_nic_t *enp);
1409227569Sphilip
1410227569Sphilip#endif	/* EFSYS_OPT_NVRAM */
1411227569Sphilip
1412227569Sphilip#if EFSYS_OPT_BOOTCFG
1413227569Sphilip
1414293927Sarybchikextern				efx_rc_t
1415227569Sphilipefx_bootcfg_read(
1416227569Sphilip	__in			efx_nic_t *enp,
1417227569Sphilip	__out_bcount(size)	caddr_t data,
1418227569Sphilip	__in			size_t size);
1419227569Sphilip
1420293927Sarybchikextern				efx_rc_t
1421227569Sphilipefx_bootcfg_write(
1422227569Sphilip	__in			efx_nic_t *enp,
1423227569Sphilip	__in_bcount(size)	caddr_t data,
1424227569Sphilip	__in			size_t size);
1425227569Sphilip
1426227569Sphilip#endif	/* EFSYS_OPT_BOOTCFG */
1427227569Sphilip
1428227569Sphilip#if EFSYS_OPT_WOL
1429227569Sphilip
1430227569Sphiliptypedef enum efx_wol_type_e {
1431227569Sphilip	EFX_WOL_TYPE_INVALID,
1432227569Sphilip	EFX_WOL_TYPE_MAGIC,
1433227569Sphilip	EFX_WOL_TYPE_BITMAP,
1434227569Sphilip	EFX_WOL_TYPE_LINK,
1435227569Sphilip	EFX_WOL_NTYPES,
1436227569Sphilip} efx_wol_type_t;
1437227569Sphilip
1438227569Sphiliptypedef enum efx_lightsout_offload_type_e {
1439227569Sphilip	EFX_LIGHTSOUT_OFFLOAD_TYPE_INVALID,
1440227569Sphilip	EFX_LIGHTSOUT_OFFLOAD_TYPE_ARP,
1441227569Sphilip	EFX_LIGHTSOUT_OFFLOAD_TYPE_NS,
1442227569Sphilip} efx_lightsout_offload_type_t;
1443227569Sphilip
1444227569Sphilip#define	EFX_WOL_BITMAP_MASK_SIZE    (48)
1445227569Sphilip#define	EFX_WOL_BITMAP_VALUE_SIZE   (128)
1446227569Sphilip
1447227569Sphiliptypedef union efx_wol_param_u {
1448227569Sphilip	struct {
1449227569Sphilip		uint8_t mac_addr[6];
1450227569Sphilip	} ewp_magic;
1451227569Sphilip	struct {
1452227569Sphilip		uint8_t mask[EFX_WOL_BITMAP_MASK_SIZE];   /* 1 bit per byte */
1453227569Sphilip		uint8_t value[EFX_WOL_BITMAP_VALUE_SIZE]; /* value to match */
1454227569Sphilip		uint8_t value_len;
1455227569Sphilip	} ewp_bitmap;
1456227569Sphilip} efx_wol_param_t;
1457227569Sphilip
1458227569Sphiliptypedef union efx_lightsout_offload_param_u {
1459227569Sphilip	struct {
1460227569Sphilip		uint8_t mac_addr[6];
1461227569Sphilip		uint32_t ip;
1462227569Sphilip	} elop_arp;
1463227569Sphilip	struct {
1464227569Sphilip		uint8_t mac_addr[6];
1465227569Sphilip		uint32_t solicited_node[4];
1466227569Sphilip		uint32_t ip[4];
1467227569Sphilip	} elop_ns;
1468227569Sphilip} efx_lightsout_offload_param_t;
1469227569Sphilip
1470293927Sarybchikextern	__checkReturn	efx_rc_t
1471227569Sphilipefx_wol_init(
1472227569Sphilip	__in		efx_nic_t *enp);
1473227569Sphilip
1474293927Sarybchikextern	__checkReturn	efx_rc_t
1475227569Sphilipefx_wol_filter_clear(
1476227569Sphilip	__in		efx_nic_t *enp);
1477227569Sphilip
1478293927Sarybchikextern	__checkReturn	efx_rc_t
1479227569Sphilipefx_wol_filter_add(
1480227569Sphilip	__in		efx_nic_t *enp,
1481227569Sphilip	__in		efx_wol_type_t type,
1482227569Sphilip	__in		efx_wol_param_t *paramp,
1483227569Sphilip	__out		uint32_t *filter_idp);
1484227569Sphilip
1485293927Sarybchikextern	__checkReturn	efx_rc_t
1486227569Sphilipefx_wol_filter_remove(
1487227569Sphilip	__in		efx_nic_t *enp,
1488227569Sphilip	__in		uint32_t filter_id);
1489227569Sphilip
1490293927Sarybchikextern	__checkReturn	efx_rc_t
1491227569Sphilipefx_lightsout_offload_add(
1492227569Sphilip	__in		efx_nic_t *enp,
1493227569Sphilip	__in		efx_lightsout_offload_type_t type,
1494227569Sphilip	__in		efx_lightsout_offload_param_t *paramp,
1495227569Sphilip	__out		uint32_t *filter_idp);
1496227569Sphilip
1497293927Sarybchikextern	__checkReturn	efx_rc_t
1498227569Sphilipefx_lightsout_offload_remove(
1499227569Sphilip	__in		efx_nic_t *enp,
1500227569Sphilip	__in		efx_lightsout_offload_type_t type,
1501227569Sphilip	__in		uint32_t filter_id);
1502227569Sphilip
1503227569Sphilipextern			void
1504227569Sphilipefx_wol_fini(
1505227569Sphilip	__in		efx_nic_t *enp);
1506227569Sphilip
1507227569Sphilip#endif	/* EFSYS_OPT_WOL */
1508227569Sphilip
1509227569Sphilip#if EFSYS_OPT_DIAG
1510227569Sphilip
1511227569Sphiliptypedef enum efx_pattern_type_t {
1512227569Sphilip	EFX_PATTERN_BYTE_INCREMENT = 0,
1513227569Sphilip	EFX_PATTERN_ALL_THE_SAME,
1514227569Sphilip	EFX_PATTERN_BIT_ALTERNATE,
1515227569Sphilip	EFX_PATTERN_BYTE_ALTERNATE,
1516227569Sphilip	EFX_PATTERN_BYTE_CHANGING,
1517227569Sphilip	EFX_PATTERN_BIT_SWEEP,
1518227569Sphilip	EFX_PATTERN_NTYPES
1519227569Sphilip} efx_pattern_type_t;
1520227569Sphilip
1521227569Sphiliptypedef 		void
1522227569Sphilip(*efx_sram_pattern_fn_t)(
1523227569Sphilip	__in		size_t row,
1524227569Sphilip	__in		boolean_t negate,
1525227569Sphilip	__out		efx_qword_t *eqp);
1526227569Sphilip
1527293927Sarybchikextern	__checkReturn	efx_rc_t
1528227569Sphilipefx_sram_test(
1529227569Sphilip	__in		efx_nic_t *enp,
1530227569Sphilip	__in		efx_pattern_type_t type);
1531227569Sphilip
1532227569Sphilip#endif	/* EFSYS_OPT_DIAG */
1533227569Sphilip
1534293927Sarybchikextern	__checkReturn	efx_rc_t
1535227569Sphilipefx_sram_buf_tbl_set(
1536227569Sphilip	__in		efx_nic_t *enp,
1537227569Sphilip	__in		uint32_t id,
1538227569Sphilip	__in		efsys_mem_t *esmp,
1539227569Sphilip	__in		size_t n);
1540227569Sphilip
1541227569Sphilipextern		void
1542227569Sphilipefx_sram_buf_tbl_clear(
1543227569Sphilip	__in	efx_nic_t *enp,
1544227569Sphilip	__in	uint32_t id,
1545227569Sphilip	__in	size_t n);
1546227569Sphilip
1547227569Sphilip#define	EFX_BUF_TBL_SIZE	0x20000
1548227569Sphilip
1549227569Sphilip#define	EFX_BUF_SIZE		4096
1550227569Sphilip
1551227569Sphilip/* EV */
1552227569Sphilip
1553227569Sphiliptypedef struct efx_evq_s	efx_evq_t;
1554227569Sphilip
1555227569Sphilip#if EFSYS_OPT_QSTATS
1556227569Sphilip
1557284555Sarybchik/* START MKCONFIG GENERATED EfxHeaderEventQueueBlock 6f3843f5fe7cc843 */
1558227569Sphiliptypedef enum efx_ev_qstat_e {
1559227569Sphilip	EV_ALL,
1560227569Sphilip	EV_RX,
1561227569Sphilip	EV_RX_OK,
1562227569Sphilip	EV_RX_FRM_TRUNC,
1563227569Sphilip	EV_RX_TOBE_DISC,
1564227569Sphilip	EV_RX_PAUSE_FRM_ERR,
1565227569Sphilip	EV_RX_BUF_OWNER_ID_ERR,
1566227569Sphilip	EV_RX_IPV4_HDR_CHKSUM_ERR,
1567227569Sphilip	EV_RX_TCP_UDP_CHKSUM_ERR,
1568227569Sphilip	EV_RX_ETH_CRC_ERR,
1569227569Sphilip	EV_RX_IP_FRAG_ERR,
1570227569Sphilip	EV_RX_MCAST_PKT,
1571227569Sphilip	EV_RX_MCAST_HASH_MATCH,
1572227569Sphilip	EV_RX_TCP_IPV4,
1573227569Sphilip	EV_RX_TCP_IPV6,
1574227569Sphilip	EV_RX_UDP_IPV4,
1575227569Sphilip	EV_RX_UDP_IPV6,
1576227569Sphilip	EV_RX_OTHER_IPV4,
1577227569Sphilip	EV_RX_OTHER_IPV6,
1578227569Sphilip	EV_RX_NON_IP,
1579284555Sarybchik	EV_RX_BATCH,
1580227569Sphilip	EV_TX,
1581227569Sphilip	EV_TX_WQ_FF_FULL,
1582227569Sphilip	EV_TX_PKT_ERR,
1583227569Sphilip	EV_TX_PKT_TOO_BIG,
1584227569Sphilip	EV_TX_UNEXPECTED,
1585227569Sphilip	EV_GLOBAL,
1586227569Sphilip	EV_GLOBAL_MNT,
1587227569Sphilip	EV_DRIVER,
1588227569Sphilip	EV_DRIVER_SRM_UPD_DONE,
1589227569Sphilip	EV_DRIVER_TX_DESCQ_FLS_DONE,
1590227569Sphilip	EV_DRIVER_RX_DESCQ_FLS_DONE,
1591227569Sphilip	EV_DRIVER_RX_DESCQ_FLS_FAILED,
1592227569Sphilip	EV_DRIVER_RX_DSC_ERROR,
1593227569Sphilip	EV_DRIVER_TX_DSC_ERROR,
1594227569Sphilip	EV_DRV_GEN,
1595227569Sphilip	EV_MCDI_RESPONSE,
1596227569Sphilip	EV_NQSTATS
1597227569Sphilip} efx_ev_qstat_t;
1598227569Sphilip
1599227569Sphilip/* END MKCONFIG GENERATED EfxHeaderEventQueueBlock */
1600227569Sphilip
1601227569Sphilip#endif	/* EFSYS_OPT_QSTATS */
1602227569Sphilip
1603293927Sarybchikextern	__checkReturn	efx_rc_t
1604227569Sphilipefx_ev_init(
1605227569Sphilip	__in		efx_nic_t *enp);
1606227569Sphilip
1607227569Sphilipextern		void
1608227569Sphilipefx_ev_fini(
1609227569Sphilip	__in		efx_nic_t *enp);
1610227569Sphilip
1611227569Sphilip#define	EFX_EVQ_MAXNEVS		32768
1612227569Sphilip#define	EFX_EVQ_MINNEVS		512
1613227569Sphilip
1614227569Sphilip#define	EFX_EVQ_SIZE(_nevs)	((_nevs) * sizeof (efx_qword_t))
1615227569Sphilip#define	EFX_EVQ_NBUFS(_nevs)	(EFX_EVQ_SIZE(_nevs) / EFX_BUF_SIZE)
1616227569Sphilip
1617293927Sarybchikextern	__checkReturn	efx_rc_t
1618227569Sphilipefx_ev_qcreate(
1619227569Sphilip	__in		efx_nic_t *enp,
1620227569Sphilip	__in		unsigned int index,
1621227569Sphilip	__in		efsys_mem_t *esmp,
1622227569Sphilip	__in		size_t n,
1623227569Sphilip	__in		uint32_t id,
1624227569Sphilip	__deref_out	efx_evq_t **eepp);
1625227569Sphilip
1626227569Sphilipextern		void
1627227569Sphilipefx_ev_qpost(
1628227569Sphilip	__in		efx_evq_t *eep,
1629227569Sphilip	__in		uint16_t data);
1630227569Sphilip
1631227569Sphiliptypedef __checkReturn	boolean_t
1632227569Sphilip(*efx_initialized_ev_t)(
1633227569Sphilip	__in_opt	void *arg);
1634227569Sphilip
1635227569Sphilip#define	EFX_PKT_UNICAST		0x0004
1636227569Sphilip#define	EFX_PKT_START		0x0008
1637227569Sphilip
1638227569Sphilip#define	EFX_PKT_VLAN_TAGGED	0x0010
1639227569Sphilip#define	EFX_CKSUM_TCPUDP	0x0020
1640227569Sphilip#define	EFX_CKSUM_IPV4		0x0040
1641227569Sphilip#define	EFX_PKT_CONT		0x0080
1642227569Sphilip
1643227569Sphilip#define	EFX_CHECK_VLAN		0x0100
1644227569Sphilip#define	EFX_PKT_TCP		0x0200
1645227569Sphilip#define	EFX_PKT_UDP		0x0400
1646227569Sphilip#define	EFX_PKT_IPV4		0x0800
1647227569Sphilip
1648227569Sphilip#define	EFX_PKT_IPV6		0x1000
1649284555Sarybchik#define	EFX_PKT_PREFIX_LEN	0x2000
1650227569Sphilip#define	EFX_ADDR_MISMATCH	0x4000
1651227569Sphilip#define	EFX_DISCARD		0x8000
1652227569Sphilip
1653227569Sphilip#define	EFX_EV_RX_NLABELS	32
1654227569Sphilip#define	EFX_EV_TX_NLABELS	32
1655227569Sphilip
1656227569Sphiliptypedef	__checkReturn	boolean_t
1657227569Sphilip(*efx_rx_ev_t)(
1658227569Sphilip	__in_opt	void *arg,
1659227569Sphilip	__in		uint32_t label,
1660227569Sphilip	__in		uint32_t id,
1661227569Sphilip	__in		uint32_t size,
1662227569Sphilip	__in		uint16_t flags);
1663227569Sphilip
1664227569Sphiliptypedef	__checkReturn	boolean_t
1665227569Sphilip(*efx_tx_ev_t)(
1666227569Sphilip	__in_opt	void *arg,
1667227569Sphilip	__in		uint32_t label,
1668227569Sphilip	__in		uint32_t id);
1669227569Sphilip
1670227569Sphilip#define	EFX_EXCEPTION_RX_RECOVERY	0x00000001
1671227569Sphilip#define	EFX_EXCEPTION_RX_DSC_ERROR	0x00000002
1672227569Sphilip#define	EFX_EXCEPTION_TX_DSC_ERROR	0x00000003
1673227569Sphilip#define	EFX_EXCEPTION_UNKNOWN_SENSOREVT	0x00000004
1674227569Sphilip#define	EFX_EXCEPTION_FWALERT_SRAM	0x00000005
1675227569Sphilip#define	EFX_EXCEPTION_UNKNOWN_FWALERT	0x00000006
1676284555Sarybchik#define	EFX_EXCEPTION_RX_ERROR		0x00000007
1677284555Sarybchik#define	EFX_EXCEPTION_TX_ERROR		0x00000008
1678284555Sarybchik#define	EFX_EXCEPTION_EV_ERROR		0x00000009
1679227569Sphilip
1680227569Sphiliptypedef	__checkReturn	boolean_t
1681227569Sphilip(*efx_exception_ev_t)(
1682227569Sphilip	__in_opt	void *arg,
1683227569Sphilip	__in		uint32_t label,
1684227569Sphilip	__in		uint32_t data);
1685227569Sphilip
1686227569Sphiliptypedef	__checkReturn	boolean_t
1687227569Sphilip(*efx_rxq_flush_done_ev_t)(
1688227569Sphilip	__in_opt	void *arg,
1689265884Sgnn	__in		uint32_t rxq_index);
1690227569Sphilip
1691227569Sphiliptypedef	__checkReturn	boolean_t
1692227569Sphilip(*efx_rxq_flush_failed_ev_t)(
1693227569Sphilip	__in_opt	void *arg,
1694265884Sgnn	__in		uint32_t rxq_index);
1695227569Sphilip
1696227569Sphiliptypedef	__checkReturn	boolean_t
1697227569Sphilip(*efx_txq_flush_done_ev_t)(
1698227569Sphilip	__in_opt	void *arg,
1699265884Sgnn	__in		uint32_t txq_index);
1700227569Sphilip
1701227569Sphiliptypedef	__checkReturn	boolean_t
1702227569Sphilip(*efx_software_ev_t)(
1703227569Sphilip	__in_opt	void *arg,
1704227569Sphilip	__in		uint16_t magic);
1705227569Sphilip
1706227569Sphiliptypedef	__checkReturn	boolean_t
1707227569Sphilip(*efx_sram_ev_t)(
1708227569Sphilip	__in_opt	void *arg,
1709227569Sphilip	__in		uint32_t code);
1710227569Sphilip
1711227569Sphilip#define	EFX_SRAM_CLEAR		0
1712227569Sphilip#define	EFX_SRAM_UPDATE		1
1713227569Sphilip#define	EFX_SRAM_ILLEGAL_CLEAR	2
1714227569Sphilip
1715227569Sphiliptypedef	__checkReturn	boolean_t
1716227569Sphilip(*efx_wake_up_ev_t)(
1717227569Sphilip	__in_opt	void *arg,
1718227569Sphilip	__in		uint32_t label);
1719227569Sphilip
1720227569Sphiliptypedef	__checkReturn	boolean_t
1721227569Sphilip(*efx_timer_ev_t)(
1722227569Sphilip	__in_opt	void *arg,
1723227569Sphilip	__in		uint32_t label);
1724227569Sphilip
1725227569Sphiliptypedef __checkReturn	boolean_t
1726227569Sphilip(*efx_link_change_ev_t)(
1727227569Sphilip	__in_opt	void *arg,
1728227569Sphilip	__in		efx_link_mode_t	link_mode);
1729227569Sphilip
1730227569Sphilip#if EFSYS_OPT_MON_STATS
1731227569Sphilip
1732227569Sphiliptypedef __checkReturn	boolean_t
1733227569Sphilip(*efx_monitor_ev_t)(
1734227569Sphilip	__in_opt	void *arg,
1735227569Sphilip	__in		efx_mon_stat_t id,
1736227569Sphilip	__in		efx_mon_stat_value_t value);
1737227569Sphilip
1738227569Sphilip#endif	/* EFSYS_OPT_MON_STATS */
1739227569Sphilip
1740227569Sphilip#if EFSYS_OPT_MAC_STATS
1741227569Sphilip
1742227569Sphiliptypedef __checkReturn	boolean_t
1743227569Sphilip(*efx_mac_stats_ev_t)(
1744227569Sphilip	__in_opt	void *arg,
1745227569Sphilip	__in		uint32_t generation
1746227569Sphilip	);
1747227569Sphilip
1748227569Sphilip#endif	/* EFSYS_OPT_MAC_STATS */
1749227569Sphilip
1750227569Sphiliptypedef struct efx_ev_callbacks_s {
1751227569Sphilip	efx_initialized_ev_t		eec_initialized;
1752227569Sphilip	efx_rx_ev_t			eec_rx;
1753227569Sphilip	efx_tx_ev_t			eec_tx;
1754227569Sphilip	efx_exception_ev_t		eec_exception;
1755227569Sphilip	efx_rxq_flush_done_ev_t		eec_rxq_flush_done;
1756227569Sphilip	efx_rxq_flush_failed_ev_t	eec_rxq_flush_failed;
1757227569Sphilip	efx_txq_flush_done_ev_t		eec_txq_flush_done;
1758227569Sphilip	efx_software_ev_t		eec_software;
1759227569Sphilip	efx_sram_ev_t			eec_sram;
1760227569Sphilip	efx_wake_up_ev_t		eec_wake_up;
1761227569Sphilip	efx_timer_ev_t			eec_timer;
1762227569Sphilip	efx_link_change_ev_t		eec_link_change;
1763227569Sphilip#if EFSYS_OPT_MON_STATS
1764227569Sphilip	efx_monitor_ev_t		eec_monitor;
1765227569Sphilip#endif	/* EFSYS_OPT_MON_STATS */
1766227569Sphilip#if EFSYS_OPT_MAC_STATS
1767227569Sphilip	efx_mac_stats_ev_t		eec_mac_stats;
1768284555Sarybchik#endif	/* EFSYS_OPT_MAC_STATS */
1769227569Sphilip} efx_ev_callbacks_t;
1770227569Sphilip
1771227569Sphilipextern	__checkReturn	boolean_t
1772227569Sphilipefx_ev_qpending(
1773227569Sphilip	__in		efx_evq_t *eep,
1774227569Sphilip	__in		unsigned int count);
1775227569Sphilip
1776227569Sphilip#if EFSYS_OPT_EV_PREFETCH
1777227569Sphilip
1778227569Sphilipextern			void
1779227569Sphilipefx_ev_qprefetch(
1780227569Sphilip	__in		efx_evq_t *eep,
1781227569Sphilip	__in		unsigned int count);
1782227569Sphilip
1783227569Sphilip#endif	/* EFSYS_OPT_EV_PREFETCH */
1784227569Sphilip
1785227569Sphilipextern			void
1786227569Sphilipefx_ev_qpoll(
1787227569Sphilip	__in		efx_evq_t *eep,
1788227569Sphilip	__inout		unsigned int *countp,
1789227569Sphilip	__in		const efx_ev_callbacks_t *eecp,
1790227569Sphilip	__in_opt	void *arg);
1791227569Sphilip
1792293927Sarybchikextern	__checkReturn	efx_rc_t
1793227569Sphilipefx_ev_qmoderate(
1794227569Sphilip	__in		efx_evq_t *eep,
1795227569Sphilip	__in		unsigned int us);
1796227569Sphilip
1797293927Sarybchikextern	__checkReturn	efx_rc_t
1798227569Sphilipefx_ev_qprime(
1799227569Sphilip	__in		efx_evq_t *eep,
1800227569Sphilip	__in		unsigned int count);
1801227569Sphilip
1802227569Sphilip#if EFSYS_OPT_QSTATS
1803227569Sphilip
1804227569Sphilip#if EFSYS_OPT_NAMES
1805227569Sphilip
1806284555Sarybchikextern		const char *
1807227569Sphilipefx_ev_qstat_name(
1808227569Sphilip	__in	efx_nic_t *enp,
1809227569Sphilip	__in	unsigned int id);
1810227569Sphilip
1811227569Sphilip#endif	/* EFSYS_OPT_NAMES */
1812227569Sphilip
1813227569Sphilipextern					void
1814227569Sphilipefx_ev_qstats_update(
1815227569Sphilip	__in				efx_evq_t *eep,
1816227569Sphilip	__inout_ecount(EV_NQSTATS)	efsys_stat_t *stat);
1817227569Sphilip
1818227569Sphilip#endif	/* EFSYS_OPT_QSTATS */
1819227569Sphilip
1820227569Sphilipextern		void
1821227569Sphilipefx_ev_qdestroy(
1822227569Sphilip	__in	efx_evq_t *eep);
1823227569Sphilip
1824227569Sphilip/* RX */
1825227569Sphilip
1826293927Sarybchikextern	__checkReturn	efx_rc_t
1827227569Sphilipefx_rx_init(
1828284555Sarybchik	__inout		efx_nic_t *enp);
1829227569Sphilip
1830227569Sphilipextern		void
1831227569Sphilipefx_rx_fini(
1832227569Sphilip	__in		efx_nic_t *enp);
1833227569Sphilip
1834227569Sphilip#if EFSYS_OPT_RX_SCATTER
1835293927Sarybchik	__checkReturn	efx_rc_t
1836227569Sphilipefx_rx_scatter_enable(
1837227569Sphilip	__in		efx_nic_t *enp,
1838227569Sphilip	__in		unsigned int buf_size);
1839227569Sphilip#endif	/* EFSYS_OPT_RX_SCATTER */
1840227569Sphilip
1841227569Sphilip#if EFSYS_OPT_RX_SCALE
1842227569Sphilip
1843227569Sphiliptypedef enum efx_rx_hash_alg_e {
1844227569Sphilip	EFX_RX_HASHALG_LFSR = 0,
1845227569Sphilip	EFX_RX_HASHALG_TOEPLITZ
1846227569Sphilip} efx_rx_hash_alg_t;
1847227569Sphilip
1848227569Sphiliptypedef enum efx_rx_hash_type_e {
1849227569Sphilip	EFX_RX_HASH_IPV4 = 0,
1850227569Sphilip	EFX_RX_HASH_TCPIPV4,
1851227569Sphilip	EFX_RX_HASH_IPV6,
1852227569Sphilip	EFX_RX_HASH_TCPIPV6,
1853227569Sphilip} efx_rx_hash_type_t;
1854227569Sphilip
1855284555Sarybchiktypedef enum efx_rx_hash_support_e {
1856284555Sarybchik	EFX_RX_HASH_UNAVAILABLE = 0,	/* Hardware hash not inserted */
1857284555Sarybchik	EFX_RX_HASH_AVAILABLE		/* Insert hash with/without RSS */
1858284555Sarybchik} efx_rx_hash_support_t;
1859284555Sarybchik
1860227569Sphilip#define	EFX_RSS_TBL_SIZE	128	/* Rows in RX indirection table */
1861227569Sphilip#define	EFX_MAXRSS	    	64	/* RX indirection entry range */
1862227569Sphilip#define	EFX_MAXRSS_LEGACY   	16 	/* See bug16611 and bug17213 */
1863227569Sphilip
1864284555Sarybchiktypedef enum efx_rx_scale_support_e {
1865284555Sarybchik	EFX_RX_SCALE_UNAVAILABLE = 0,	/* Not supported */
1866284555Sarybchik	EFX_RX_SCALE_EXCLUSIVE,		/* Writable key/indirection table */
1867284555Sarybchik	EFX_RX_SCALE_SHARED		/* Read-only key/indirection table */
1868284555Sarybchik} efx_rx_scale_support_t;
1869284555Sarybchik
1870293927Sarybchikextern	__checkReturn	efx_rc_t
1871284555Sarybchikefx_rx_hash_support_get(
1872284555Sarybchik	__in		efx_nic_t *enp,
1873284555Sarybchik	__out		efx_rx_hash_support_t *supportp);
1874284555Sarybchik
1875284555Sarybchik
1876293927Sarybchikextern	__checkReturn	efx_rc_t
1877284555Sarybchikefx_rx_scale_support_get(
1878284555Sarybchik	__in		efx_nic_t *enp,
1879284555Sarybchik	__out		efx_rx_scale_support_t *supportp);
1880284555Sarybchik
1881293927Sarybchikextern	__checkReturn	efx_rc_t
1882227569Sphilipefx_rx_scale_mode_set(
1883227569Sphilip	__in	efx_nic_t *enp,
1884227569Sphilip	__in	efx_rx_hash_alg_t alg,
1885227569Sphilip	__in	efx_rx_hash_type_t type,
1886227569Sphilip	__in	boolean_t insert);
1887227569Sphilip
1888293927Sarybchikextern	__checkReturn	efx_rc_t
1889227569Sphilipefx_rx_scale_tbl_set(
1890227569Sphilip	__in		efx_nic_t *enp,
1891227569Sphilip	__in_ecount(n)	unsigned int *table,
1892227569Sphilip	__in		size_t n);
1893227569Sphilip
1894293927Sarybchikextern	__checkReturn	efx_rc_t
1895284555Sarybchikefx_rx_scale_key_set(
1896227569Sphilip	__in		efx_nic_t *enp,
1897227569Sphilip	__in_ecount(n)	uint8_t *key,
1898227569Sphilip	__in		size_t n);
1899227569Sphilip
1900294008Sarybchikextern	__checkReturn	uint32_t
1901284555Sarybchikefx_psuedo_hdr_hash_get(
1902227569Sphilip	__in		efx_nic_t *enp,
1903284555Sarybchik	__in		efx_rx_hash_alg_t func,
1904284555Sarybchik	__in		uint8_t *buffer);
1905227569Sphilip
1906284555Sarybchik#endif	/* EFSYS_OPT_RX_SCALE */
1907227569Sphilip
1908293927Sarybchikextern	__checkReturn	efx_rc_t
1909284555Sarybchikefx_psuedo_hdr_pkt_length_get(
1910284555Sarybchik	__in		efx_nic_t *enp,
1911284555Sarybchik	__in		uint8_t *buffer,
1912284555Sarybchik	__out		uint16_t *pkt_lengthp);
1913227569Sphilip
1914280553Sarybchik#define	EFX_RXQ_MAXNDESCS		4096
1915280553Sarybchik#define	EFX_RXQ_MINNDESCS		512
1916227569Sphilip
1917280553Sarybchik#define	EFX_RXQ_SIZE(_ndescs)		((_ndescs) * sizeof (efx_qword_t))
1918280553Sarybchik#define	EFX_RXQ_NBUFS(_ndescs)		(EFX_RXQ_SIZE(_ndescs) / EFX_BUF_SIZE)
1919280553Sarybchik#define	EFX_RXQ_LIMIT(_ndescs)		((_ndescs) - 16)
1920280562Sarybchik#define	EFX_RXQ_DC_NDESCS(_dcsize)	(8 << _dcsize)
1921227569Sphilip
1922227569Sphiliptypedef enum efx_rxq_type_e {
1923227569Sphilip	EFX_RXQ_TYPE_DEFAULT,
1924227569Sphilip	EFX_RXQ_TYPE_SCATTER,
1925227569Sphilip	EFX_RXQ_NTYPES
1926227569Sphilip} efx_rxq_type_t;
1927227569Sphilip
1928293927Sarybchikextern	__checkReturn	efx_rc_t
1929227569Sphilipefx_rx_qcreate(
1930227569Sphilip	__in		efx_nic_t *enp,
1931227569Sphilip	__in		unsigned int index,
1932227569Sphilip	__in		unsigned int label,
1933227569Sphilip	__in		efx_rxq_type_t type,
1934227569Sphilip	__in		efsys_mem_t *esmp,
1935227569Sphilip	__in		size_t n,
1936227569Sphilip	__in		uint32_t id,
1937227569Sphilip	__in		efx_evq_t *eep,
1938227569Sphilip	__deref_out	efx_rxq_t **erpp);
1939227569Sphilip
1940227569Sphiliptypedef struct efx_buffer_s {
1941227569Sphilip	efsys_dma_addr_t	eb_addr;
1942227569Sphilip	size_t			eb_size;
1943227569Sphilip	boolean_t		eb_eop;
1944227569Sphilip} efx_buffer_t;
1945227569Sphilip
1946284555Sarybchiktypedef struct efx_desc_s {
1947284555Sarybchik	efx_qword_t ed_eq;
1948284555Sarybchik} efx_desc_t;
1949284555Sarybchik
1950227569Sphilipextern			void
1951227569Sphilipefx_rx_qpost(
1952227569Sphilip	__in		efx_rxq_t *erp,
1953227569Sphilip	__in_ecount(n)	efsys_dma_addr_t *addrp,
1954227569Sphilip	__in		size_t size,
1955227569Sphilip	__in		unsigned int n,
1956227569Sphilip	__in		unsigned int completed,
1957227569Sphilip	__in		unsigned int added);
1958227569Sphilip
1959227569Sphilipextern		void
1960227569Sphilipefx_rx_qpush(
1961227569Sphilip	__in	efx_rxq_t *erp,
1962284555Sarybchik	__in	unsigned int added,
1963284555Sarybchik	__inout	unsigned int *pushedp);
1964227569Sphilip
1965293927Sarybchikextern	__checkReturn	efx_rc_t
1966227569Sphilipefx_rx_qflush(
1967227569Sphilip	__in	efx_rxq_t *erp);
1968227569Sphilip
1969227569Sphilipextern		void
1970227569Sphilipefx_rx_qenable(
1971227569Sphilip	__in	efx_rxq_t *erp);
1972227569Sphilip
1973227569Sphilipextern		void
1974227569Sphilipefx_rx_qdestroy(
1975227569Sphilip	__in	efx_rxq_t *erp);
1976227569Sphilip
1977227569Sphilip/* TX */
1978227569Sphilip
1979227569Sphiliptypedef struct efx_txq_s	efx_txq_t;
1980227569Sphilip
1981227569Sphilip#if EFSYS_OPT_QSTATS
1982227569Sphilip
1983284555Sarybchik/* START MKCONFIG GENERATED EfxHeaderTransmitQueueBlock 12dff8778598b2db */
1984227569Sphiliptypedef enum efx_tx_qstat_e {
1985227569Sphilip	TX_POST,
1986284555Sarybchik	TX_POST_PIO,
1987227569Sphilip	TX_NQSTATS
1988227569Sphilip} efx_tx_qstat_t;
1989227569Sphilip
1990227569Sphilip/* END MKCONFIG GENERATED EfxHeaderTransmitQueueBlock */
1991227569Sphilip
1992227569Sphilip#endif	/* EFSYS_OPT_QSTATS */
1993227569Sphilip
1994293927Sarybchikextern	__checkReturn	efx_rc_t
1995227569Sphilipefx_tx_init(
1996227569Sphilip	__in		efx_nic_t *enp);
1997227569Sphilip
1998227569Sphilipextern		void
1999227569Sphilipefx_tx_fini(
2000227569Sphilip	__in	efx_nic_t *enp);
2001227569Sphilip
2002284555Sarybchik#define	EFX_BUG35388_WORKAROUND(_encp)					\
2003284555Sarybchik	(((_encp) == NULL) ? 1 : ((_encp)->enc_bug35388_workaround != 0))
2004284555Sarybchik
2005284555Sarybchik#define	EFX_TXQ_MAXNDESCS(_encp)					\
2006284555Sarybchik	((EFX_BUG35388_WORKAROUND(_encp)) ? 2048 : 4096)
2007284555Sarybchik
2008280553Sarybchik#define	EFX_TXQ_MINNDESCS		512
2009227569Sphilip
2010280553Sarybchik#define	EFX_TXQ_SIZE(_ndescs)		((_ndescs) * sizeof (efx_qword_t))
2011280553Sarybchik#define	EFX_TXQ_NBUFS(_ndescs)		(EFX_TXQ_SIZE(_ndescs) / EFX_BUF_SIZE)
2012280553Sarybchik#define	EFX_TXQ_LIMIT(_ndescs)		((_ndescs) - 16)
2013280562Sarybchik#define	EFX_TXQ_DC_NDESCS(_dcsize)	(8 << _dcsize)
2014227569Sphilip
2015284555Sarybchik#define	EFX_TXQ_MAX_BUFS 8 /* Maximum independent of EFX_BUG35388_WORKAROUND. */
2016284555Sarybchik
2017293955Sarybchik#define	EFX_TXQ_CKSUM_IPV4	0x0001
2018293955Sarybchik#define	EFX_TXQ_CKSUM_TCPUDP	0x0002
2019294381Sarybchik#define	EFX_TXQ_FATSOV2		0x0004
2020293955Sarybchik
2021293927Sarybchikextern	__checkReturn	efx_rc_t
2022227569Sphilipefx_tx_qcreate(
2023227569Sphilip	__in		efx_nic_t *enp,
2024227569Sphilip	__in		unsigned int index,
2025227569Sphilip	__in		unsigned int label,
2026227569Sphilip	__in		efsys_mem_t *esmp,
2027227569Sphilip	__in		size_t n,
2028227569Sphilip	__in		uint32_t id,
2029227569Sphilip	__in		uint16_t flags,
2030227569Sphilip	__in		efx_evq_t *eep,
2031284555Sarybchik	__deref_out	efx_txq_t **etpp,
2032284555Sarybchik	__out		unsigned int *addedp);
2033227569Sphilip
2034293927Sarybchikextern	__checkReturn	efx_rc_t
2035227569Sphilipefx_tx_qpost(
2036227569Sphilip	__in		efx_txq_t *etp,
2037227569Sphilip	__in_ecount(n)	efx_buffer_t *eb,
2038227569Sphilip	__in		unsigned int n,
2039227569Sphilip	__in		unsigned int completed,
2040227569Sphilip	__inout		unsigned int *addedp);
2041227569Sphilip
2042293927Sarybchikextern	__checkReturn	efx_rc_t
2043280589Sarybchikefx_tx_qpace(
2044280589Sarybchik	__in		efx_txq_t *etp,
2045280589Sarybchik	__in		unsigned int ns);
2046280589Sarybchik
2047284555Sarybchikextern			void
2048227569Sphilipefx_tx_qpush(
2049284555Sarybchik	__in		efx_txq_t *etp,
2050284555Sarybchik	__in		unsigned int added,
2051284555Sarybchik	__in		unsigned int pushed);
2052227569Sphilip
2053293927Sarybchikextern	__checkReturn	efx_rc_t
2054227569Sphilipefx_tx_qflush(
2055284555Sarybchik	__in		efx_txq_t *etp);
2056227569Sphilip
2057284555Sarybchikextern			void
2058227569Sphilipefx_tx_qenable(
2059284555Sarybchik	__in		efx_txq_t *etp);
2060227569Sphilip
2061293927Sarybchikextern	__checkReturn	efx_rc_t
2062284555Sarybchikefx_tx_qpio_enable(
2063284555Sarybchik	__in		efx_txq_t *etp);
2064284555Sarybchik
2065284555Sarybchikextern			void
2066284555Sarybchikefx_tx_qpio_disable(
2067284555Sarybchik	__in		efx_txq_t *etp);
2068284555Sarybchik
2069293927Sarybchikextern	__checkReturn	efx_rc_t
2070284555Sarybchikefx_tx_qpio_write(
2071284555Sarybchik	__in			efx_txq_t *etp,
2072284555Sarybchik	__in_ecount(buf_length)	uint8_t *buffer,
2073284555Sarybchik	__in			size_t buf_length,
2074284555Sarybchik	__in                    size_t pio_buf_offset);
2075284555Sarybchik
2076293927Sarybchikextern	__checkReturn	efx_rc_t
2077284555Sarybchikefx_tx_qpio_post(
2078284555Sarybchik	__in			efx_txq_t *etp,
2079284555Sarybchik	__in			size_t pkt_length,
2080284555Sarybchik	__in			unsigned int completed,
2081284555Sarybchik	__inout			unsigned int *addedp);
2082284555Sarybchik
2083293927Sarybchikextern	__checkReturn	efx_rc_t
2084284555Sarybchikefx_tx_qdesc_post(
2085284555Sarybchik	__in		efx_txq_t *etp,
2086284555Sarybchik	__in_ecount(n)	efx_desc_t *ed,
2087284555Sarybchik	__in		unsigned int n,
2088284555Sarybchik	__in		unsigned int completed,
2089284555Sarybchik	__inout		unsigned int *addedp);
2090284555Sarybchik
2091284555Sarybchikextern	void
2092284555Sarybchikefx_tx_qdesc_dma_create(
2093284555Sarybchik	__in	efx_txq_t *etp,
2094284555Sarybchik	__in	efsys_dma_addr_t addr,
2095284555Sarybchik	__in	size_t size,
2096284555Sarybchik	__in	boolean_t eop,
2097284555Sarybchik	__out	efx_desc_t *edp);
2098284555Sarybchik
2099284555Sarybchikextern	void
2100284555Sarybchikefx_tx_qdesc_tso_create(
2101284555Sarybchik	__in	efx_txq_t *etp,
2102284555Sarybchik	__in	uint16_t ipv4_id,
2103284555Sarybchik	__in	uint32_t tcp_seq,
2104284555Sarybchik	__in	uint8_t  tcp_flags,
2105284555Sarybchik	__out	efx_desc_t *edp);
2106284555Sarybchik
2107294381Sarybchik/* Number of FATSOv2 option descriptors */
2108294381Sarybchik#define	EFX_TX_FATSOV2_OPT_NDESCS		2
2109294381Sarybchik
2110294381Sarybchik/* Maximum number of DMA segments per TSO packet (not superframe) */
2111294381Sarybchik#define	EFX_TX_FATSOV2_DMA_SEGS_PER_PKT_MAX	24
2112294381Sarybchik
2113284555Sarybchikextern	void
2114294381Sarybchikefx_tx_qdesc_tso2_create(
2115294381Sarybchik	__in			efx_txq_t *etp,
2116294381Sarybchik	__in			uint16_t ipv4_id,
2117294381Sarybchik	__in			uint32_t tcp_seq,
2118294381Sarybchik	__in			uint16_t tcp_mss,
2119294381Sarybchik	__out_ecount(count)	efx_desc_t *edp,
2120294381Sarybchik	__in			int count);
2121294381Sarybchik
2122294381Sarybchikextern	void
2123284555Sarybchikefx_tx_qdesc_vlantci_create(
2124284555Sarybchik	__in	efx_txq_t *etp,
2125284555Sarybchik	__in	uint16_t tci,
2126284555Sarybchik	__out	efx_desc_t *edp);
2127284555Sarybchik
2128227569Sphilip#if EFSYS_OPT_QSTATS
2129227569Sphilip
2130227569Sphilip#if EFSYS_OPT_NAMES
2131227569Sphilip
2132284555Sarybchikextern		const char *
2133227569Sphilipefx_tx_qstat_name(
2134227569Sphilip	__in	efx_nic_t *etp,
2135227569Sphilip	__in	unsigned int id);
2136227569Sphilip
2137227569Sphilip#endif	/* EFSYS_OPT_NAMES */
2138227569Sphilip
2139227569Sphilipextern					void
2140227569Sphilipefx_tx_qstats_update(
2141227569Sphilip	__in				efx_txq_t *etp,
2142227569Sphilip	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
2143227569Sphilip
2144227569Sphilip#endif	/* EFSYS_OPT_QSTATS */
2145227569Sphilip
2146227569Sphilipextern		void
2147227569Sphilipefx_tx_qdestroy(
2148227569Sphilip	__in	efx_txq_t *etp);
2149227569Sphilip
2150227569Sphilip
2151227569Sphilip/* FILTER */
2152227569Sphilip
2153227569Sphilip#if EFSYS_OPT_FILTER
2154227569Sphilip
2155284555Sarybchik#define	EFX_ETHER_TYPE_IPV4 0x0800
2156284555Sarybchik#define	EFX_ETHER_TYPE_IPV6 0x86DD
2157284555Sarybchik
2158284555Sarybchik#define	EFX_IPPROTO_TCP 6
2159284555Sarybchik#define	EFX_IPPROTO_UDP 17
2160284555Sarybchik
2161227569Sphiliptypedef enum efx_filter_flag_e {
2162227569Sphilip	EFX_FILTER_FLAG_RX_RSS = 0x01,		/* use RSS to spread across
2163227569Sphilip						 * multiple queues */
2164227569Sphilip	EFX_FILTER_FLAG_RX_SCATTER = 0x02,	/* enable RX scatter */
2165284555Sarybchik	EFX_FILTER_FLAG_RX_OVER_AUTO = 0x04,	/* Override an automatic filter
2166284555Sarybchik						 * (priority EFX_FILTER_PRI_AUTO).
2167284555Sarybchik						 * May only be set by the filter
2168284555Sarybchik						 * implementation for each type.
2169284555Sarybchik						 * A removal request will
2170284555Sarybchik						 * restore the automatic filter
2171284555Sarybchik						 * in its place. */
2172284555Sarybchik	EFX_FILTER_FLAG_RX = 0x08,		/* Filter is for RX */
2173284555Sarybchik	EFX_FILTER_FLAG_TX = 0x10,		/* Filter is for TX */
2174227569Sphilip} efx_filter_flag_t;
2175227569Sphilip
2176284555Sarybchiktypedef enum efx_filter_match_flags_e {
2177284555Sarybchik	EFX_FILTER_MATCH_REM_HOST = 0x0001,	/* Match by remote IP host
2178284555Sarybchik						 * address */
2179284555Sarybchik	EFX_FILTER_MATCH_LOC_HOST = 0x0002,	/* Match by local IP host
2180284555Sarybchik						 * address */
2181284555Sarybchik	EFX_FILTER_MATCH_REM_MAC = 0x0004,	/* Match by remote MAC address */
2182284555Sarybchik	EFX_FILTER_MATCH_REM_PORT = 0x0008,	/* Match by remote TCP/UDP port */
2183284555Sarybchik	EFX_FILTER_MATCH_LOC_MAC = 0x0010,	/* Match by remote TCP/UDP port */
2184284555Sarybchik	EFX_FILTER_MATCH_LOC_PORT = 0x0020,	/* Match by local TCP/UDP port */
2185284555Sarybchik	EFX_FILTER_MATCH_ETHER_TYPE = 0x0040,	/* Match by Ether-type */
2186284555Sarybchik	EFX_FILTER_MATCH_INNER_VID = 0x0080,	/* Match by inner VLAN ID */
2187284555Sarybchik	EFX_FILTER_MATCH_OUTER_VID = 0x0100,	/* Match by outer VLAN ID */
2188284555Sarybchik	EFX_FILTER_MATCH_IP_PROTO = 0x0200,	/* Match by IP transport
2189284555Sarybchik						 * protocol */
2190284555Sarybchik	EFX_FILTER_MATCH_LOC_MAC_IG = 0x0400,	/* Match by local MAC address
2191284555Sarybchik						 * I/G bit. Used for RX default
2192284555Sarybchik						 * unicast and multicast/
2193284555Sarybchik						 * broadcast filters. */
2194284555Sarybchik} efx_filter_match_flags_t;
2195284555Sarybchik
2196284555Sarybchiktypedef enum efx_filter_priority_s {
2197284555Sarybchik	EFX_FILTER_PRI_HINT = 0,	/* Performance hint */
2198284555Sarybchik	EFX_FILTER_PRI_AUTO,		/* Automatic filter based on device
2199284555Sarybchik					 * address list or hardware
2200284555Sarybchik					 * requirements. This may only be used
2201284555Sarybchik					 * by the filter implementation for
2202284555Sarybchik					 * each NIC type. */
2203284555Sarybchik	EFX_FILTER_PRI_MANUAL,		/* Manually configured filter */
2204284555Sarybchik	EFX_FILTER_PRI_REQUIRED,	/* Required for correct behaviour of the
2205284555Sarybchik					 * client (e.g. SR-IOV, HyperV VMQ etc.)
2206284555Sarybchik					 */
2207284555Sarybchik} efx_filter_priority_t;
2208284555Sarybchik
2209284555Sarybchik/*
2210284555Sarybchik * FIXME: All these fields are assumed to be in little-endian byte order.
2211284555Sarybchik * It may be better for some to be big-endian. See bug42804.
2212284555Sarybchik */
2213284555Sarybchik
2214227569Sphiliptypedef struct efx_filter_spec_s {
2215284555Sarybchik	uint32_t	efs_match_flags:12;
2216284555Sarybchik	uint32_t	efs_priority:2;
2217284555Sarybchik	uint32_t	efs_flags:6;
2218284555Sarybchik	uint32_t	efs_dmaq_id:12;
2219284555Sarybchik	uint32_t	efs_rss_context;
2220284555Sarybchik	uint16_t	efs_outer_vid;
2221284555Sarybchik	uint16_t	efs_inner_vid;
2222284555Sarybchik	uint8_t		efs_loc_mac[EFX_MAC_ADDR_LEN];
2223284555Sarybchik	uint8_t		efs_rem_mac[EFX_MAC_ADDR_LEN];
2224284555Sarybchik	uint16_t	efs_ether_type;
2225284555Sarybchik	uint8_t		efs_ip_proto;
2226284555Sarybchik	uint16_t	efs_loc_port;
2227284555Sarybchik	uint16_t	efs_rem_port;
2228284555Sarybchik	efx_oword_t	efs_rem_host;
2229284555Sarybchik	efx_oword_t	efs_loc_host;
2230227569Sphilip} efx_filter_spec_t;
2231227569Sphilip
2232284555Sarybchik
2233284555Sarybchik/* Default values for use in filter specifications */
2234284555Sarybchik#define	EFX_FILTER_SPEC_RSS_CONTEXT_DEFAULT	0xffffffff
2235284555Sarybchik#define	EFX_FILTER_SPEC_RX_DMAQ_ID_DROP		0xfff
2236284555Sarybchik#define	EFX_FILTER_SPEC_VID_UNSPEC		0xffff
2237284555Sarybchik
2238293927Sarybchikextern	__checkReturn	efx_rc_t
2239227569Sphilipefx_filter_init(
2240227569Sphilip	__in		efx_nic_t *enp);
2241227569Sphilip
2242227569Sphilipextern			void
2243227569Sphilipefx_filter_fini(
2244227569Sphilip	__in		efx_nic_t *enp);
2245227569Sphilip
2246293927Sarybchikextern	__checkReturn	efx_rc_t
2247284555Sarybchikefx_filter_insert(
2248284555Sarybchik	__in		efx_nic_t *enp,
2249227569Sphilip	__inout		efx_filter_spec_t *spec);
2250227569Sphilip
2251293927Sarybchikextern	__checkReturn	efx_rc_t
2252284555Sarybchikefx_filter_remove(
2253284555Sarybchik	__in		efx_nic_t *enp,
2254227569Sphilip	__inout		efx_filter_spec_t *spec);
2255227569Sphilip
2256293927Sarybchikextern	__checkReturn	efx_rc_t
2257227569Sphilipefx_filter_restore(
2258227569Sphilip	__in		efx_nic_t *enp);
2259227569Sphilip
2260293927Sarybchikextern	__checkReturn	efx_rc_t
2261284555Sarybchikefx_filter_supported_filters(
2262284555Sarybchik	__in		efx_nic_t *enp,
2263284555Sarybchik	__out		uint32_t *list,
2264284555Sarybchik	__out		size_t *length);
2265227569Sphilip
2266227569Sphilipextern			void
2267284555Sarybchikefx_filter_spec_init_rx(
2268294017Sarybchik	__out		efx_filter_spec_t *spec,
2269284555Sarybchik	__in		efx_filter_priority_t priority,
2270284555Sarybchik	__in		efx_filter_flag_t flags,
2271284555Sarybchik	__in		efx_rxq_t *erp);
2272227569Sphilip
2273227569Sphilipextern			void
2274284555Sarybchikefx_filter_spec_init_tx(
2275294017Sarybchik	__out		efx_filter_spec_t *spec,
2276284555Sarybchik	__in		efx_txq_t *etp);
2277227569Sphilip
2278293927Sarybchikextern	__checkReturn	efx_rc_t
2279284555Sarybchikefx_filter_spec_set_ipv4_local(
2280227569Sphilip	__inout		efx_filter_spec_t *spec,
2281284555Sarybchik	__in		uint8_t proto,
2282284555Sarybchik	__in		uint32_t host,
2283284555Sarybchik	__in		uint16_t port);
2284227569Sphilip
2285293927Sarybchikextern	__checkReturn	efx_rc_t
2286284555Sarybchikefx_filter_spec_set_ipv4_full(
2287227569Sphilip	__inout		efx_filter_spec_t *spec,
2288284555Sarybchik	__in		uint8_t proto,
2289284555Sarybchik	__in		uint32_t lhost,
2290284555Sarybchik	__in		uint16_t lport,
2291284555Sarybchik	__in		uint32_t rhost,
2292284555Sarybchik	__in		uint16_t rport);
2293227569Sphilip
2294293927Sarybchikextern	__checkReturn	efx_rc_t
2295284555Sarybchikefx_filter_spec_set_eth_local(
2296227569Sphilip	__inout		efx_filter_spec_t *spec,
2297284555Sarybchik	__in		uint16_t vid,
2298284555Sarybchik	__in		const uint8_t *addr);
2299227569Sphilip
2300293927Sarybchikextern	__checkReturn	efx_rc_t
2301284555Sarybchikefx_filter_spec_set_uc_def(
2302227569Sphilip	__inout		efx_filter_spec_t *spec);
2303227569Sphilip
2304293927Sarybchikextern	__checkReturn	efx_rc_t
2305284555Sarybchikefx_filter_spec_set_mc_def(
2306227569Sphilip	__inout		efx_filter_spec_t *spec);
2307227569Sphilip
2308284555Sarybchik#endif	/* EFSYS_OPT_FILTER */
2309227569Sphilip
2310284555Sarybchik/* HASH */
2311227569Sphilip
2312284555Sarybchikextern	__checkReturn		uint32_t
2313284555Sarybchikefx_hash_dwords(
2314284555Sarybchik	__in_ecount(count)	uint32_t const *input,
2315284555Sarybchik	__in			size_t count,
2316284555Sarybchik	__in			uint32_t init);
2317227569Sphilip
2318284555Sarybchikextern	__checkReturn		uint32_t
2319284555Sarybchikefx_hash_bytes(
2320284555Sarybchik	__in_ecount(length)	uint8_t const *input,
2321284555Sarybchik	__in			size_t length,
2322284555Sarybchik	__in			uint32_t init);
2323227569Sphilip
2324294386Sarybchik#if EFSYS_OPT_LICENSING
2325227569Sphilip
2326294386Sarybchik/* LICENSING */
2327294386Sarybchik
2328294386Sarybchiktypedef struct efx_key_stats_s {
2329294386Sarybchik	uint32_t	eks_valid;
2330294386Sarybchik	uint32_t	eks_invalid;
2331294386Sarybchik	uint32_t	eks_blacklisted;
2332294386Sarybchik	uint32_t	eks_unverifiable;
2333294386Sarybchik	uint32_t	eks_wrong_node;
2334294386Sarybchik	uint32_t	eks_licensed_apps_lo;
2335294386Sarybchik	uint32_t	eks_licensed_apps_hi;
2336294386Sarybchik	uint32_t	eks_licensed_features_lo;
2337294386Sarybchik	uint32_t	eks_licensed_features_hi;
2338294386Sarybchik} efx_key_stats_t;
2339294386Sarybchik
2340294386Sarybchikextern	__checkReturn		efx_rc_t
2341294386Sarybchikefx_lic_init(
2342294386Sarybchik	__in			efx_nic_t *enp);
2343294386Sarybchik
2344294386Sarybchikextern				void
2345294386Sarybchikefx_lic_fini(
2346294386Sarybchik	__in			efx_nic_t *enp);
2347294386Sarybchik
2348294386Sarybchikextern	__checkReturn	efx_rc_t
2349294386Sarybchikefx_lic_update_licenses(
2350294386Sarybchik	__in		efx_nic_t *enp);
2351294386Sarybchik
2352294386Sarybchikextern	__checkReturn	efx_rc_t
2353294386Sarybchikefx_lic_get_key_stats(
2354294386Sarybchik	__in		efx_nic_t *enp,
2355294386Sarybchik	__out		efx_key_stats_t *ksp);
2356294386Sarybchik
2357294386Sarybchikextern	__checkReturn	efx_rc_t
2358294386Sarybchikefx_lic_app_state(
2359294386Sarybchik	__in		efx_nic_t *enp,
2360294386Sarybchik	__in		uint64_t app_id,
2361294386Sarybchik	__out		boolean_t *licensedp);
2362294386Sarybchik
2363294386Sarybchikextern	__checkReturn	efx_rc_t
2364294386Sarybchikefx_lic_get_id(
2365294386Sarybchik	__in		efx_nic_t *enp,
2366294386Sarybchik	__in		size_t buffer_size,
2367294386Sarybchik	__out		uint32_t *typep,
2368294386Sarybchik	__out		size_t *lengthp,
2369294386Sarybchik	__out_opt	uint8_t *bufferp);
2370294386Sarybchik
2371294386Sarybchik
2372294386Sarybchik#endif	/* EFSYS_OPT_LICENSING */
2373294386Sarybchik
2374294386Sarybchik
2375294386Sarybchik
2376227569Sphilip#ifdef	__cplusplus
2377227569Sphilip}
2378227569Sphilip#endif
2379227569Sphilip
2380227569Sphilip#endif	/* _SYS_EFX_H */
2381