1227569Sphilip/*-
2301388Sarybchik * Copyright (c) 2007-2016 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: stable/10/sys/dev/sfxge/common/efx_impl.h 342512 2018-12-26 10:21:40Z arybchik $
31227569Sphilip */
32227569Sphilip
33227569Sphilip#ifndef	_SYS_EFX_IMPL_H
34227569Sphilip#define	_SYS_EFX_IMPL_H
35227569Sphilip
36227569Sphilip#include "efx.h"
37227569Sphilip#include "efx_regs.h"
38284555Sarybchik#include "efx_regs_ef10.h"
39227569Sphilip
40284555Sarybchik/* FIXME: Add definition for driver generated software events */
41284555Sarybchik#ifndef	ESE_DZ_EV_CODE_DRV_GEN_EV
42284555Sarybchik#define	ESE_DZ_EV_CODE_DRV_GEN_EV FSE_AZ_EV_CODE_DRV_GEN_EV
43284555Sarybchik#endif
44284555Sarybchik
45284555Sarybchik
46227569Sphilip#if EFSYS_OPT_SIENA
47227569Sphilip#include "siena_impl.h"
48227569Sphilip#endif	/* EFSYS_OPT_SIENA */
49227569Sphilip
50284555Sarybchik#if EFSYS_OPT_HUNTINGTON
51284555Sarybchik#include "hunt_impl.h"
52284555Sarybchik#endif	/* EFSYS_OPT_HUNTINGTON */
53284555Sarybchik
54293980Sarybchik#if EFSYS_OPT_MEDFORD
55293980Sarybchik#include "medford_impl.h"
56293980Sarybchik#endif	/* EFSYS_OPT_MEDFORD */
57293980Sarybchik
58293980Sarybchik#if (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD)
59293980Sarybchik#include "ef10_impl.h"
60293980Sarybchik#endif	/* (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */
61293980Sarybchik
62227569Sphilip#ifdef	__cplusplus
63227569Sphilipextern "C" {
64227569Sphilip#endif
65227569Sphilip
66284555Sarybchik#define	EFX_MOD_MCDI		0x00000001
67284555Sarybchik#define	EFX_MOD_PROBE		0x00000002
68284555Sarybchik#define	EFX_MOD_NVRAM		0x00000004
69284555Sarybchik#define	EFX_MOD_VPD		0x00000008
70284555Sarybchik#define	EFX_MOD_NIC		0x00000010
71284555Sarybchik#define	EFX_MOD_INTR		0x00000020
72284555Sarybchik#define	EFX_MOD_EV		0x00000040
73284555Sarybchik#define	EFX_MOD_RX		0x00000080
74284555Sarybchik#define	EFX_MOD_TX		0x00000100
75284555Sarybchik#define	EFX_MOD_PORT		0x00000200
76284555Sarybchik#define	EFX_MOD_MON		0x00000400
77284555Sarybchik#define	EFX_MOD_FILTER		0x00001000
78301327Sarybchik#define	EFX_MOD_LIC		0x00002000
79227569Sphilip
80301355Sarybchik#define	EFX_RESET_PHY		0x00000001
81301355Sarybchik#define	EFX_RESET_RXQ_ERR	0x00000002
82301355Sarybchik#define	EFX_RESET_TXQ_ERR	0x00000004
83227569Sphilip
84227569Sphiliptypedef enum efx_mac_type_e {
85227569Sphilip	EFX_MAC_INVALID = 0,
86227569Sphilip	EFX_MAC_SIENA,
87284555Sarybchik	EFX_MAC_HUNTINGTON,
88294395Sarybchik	EFX_MAC_MEDFORD,
89227569Sphilip	EFX_MAC_NTYPES
90227569Sphilip} efx_mac_type_t;
91227569Sphilip
92284555Sarybchiktypedef struct efx_ev_ops_s {
93293927Sarybchik	efx_rc_t	(*eevo_init)(efx_nic_t *);
94284555Sarybchik	void		(*eevo_fini)(efx_nic_t *);
95293927Sarybchik	efx_rc_t	(*eevo_qcreate)(efx_nic_t *, unsigned int,
96284555Sarybchik					  efsys_mem_t *, size_t, uint32_t,
97311070Sarybchik					  uint32_t, uint32_t, efx_evq_t *);
98284555Sarybchik	void		(*eevo_qdestroy)(efx_evq_t *);
99293927Sarybchik	efx_rc_t	(*eevo_qprime)(efx_evq_t *, unsigned int);
100284555Sarybchik	void		(*eevo_qpost)(efx_evq_t *, uint16_t);
101293927Sarybchik	efx_rc_t	(*eevo_qmoderate)(efx_evq_t *, unsigned int);
102284555Sarybchik#if EFSYS_OPT_QSTATS
103284555Sarybchik	void		(*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *);
104284555Sarybchik#endif
105284555Sarybchik} efx_ev_ops_t;
106284555Sarybchik
107284555Sarybchiktypedef struct efx_tx_ops_s {
108293927Sarybchik	efx_rc_t	(*etxo_init)(efx_nic_t *);
109284555Sarybchik	void		(*etxo_fini)(efx_nic_t *);
110293927Sarybchik	efx_rc_t	(*etxo_qcreate)(efx_nic_t *,
111284555Sarybchik					unsigned int, unsigned int,
112284555Sarybchik					efsys_mem_t *, size_t,
113284555Sarybchik					uint32_t, uint16_t,
114284555Sarybchik					efx_evq_t *, efx_txq_t *,
115284555Sarybchik					unsigned int *);
116284555Sarybchik	void		(*etxo_qdestroy)(efx_txq_t *);
117293927Sarybchik	efx_rc_t	(*etxo_qpost)(efx_txq_t *, efx_buffer_t *,
118284555Sarybchik				      unsigned int, unsigned int,
119284555Sarybchik				      unsigned int *);
120284555Sarybchik	void		(*etxo_qpush)(efx_txq_t *, unsigned int, unsigned int);
121293927Sarybchik	efx_rc_t	(*etxo_qpace)(efx_txq_t *, unsigned int);
122293927Sarybchik	efx_rc_t	(*etxo_qflush)(efx_txq_t *);
123284555Sarybchik	void		(*etxo_qenable)(efx_txq_t *);
124293927Sarybchik	efx_rc_t	(*etxo_qpio_enable)(efx_txq_t *);
125284555Sarybchik	void		(*etxo_qpio_disable)(efx_txq_t *);
126311063Sarybchik	efx_rc_t	(*etxo_qpio_write)(efx_txq_t *, uint8_t *, size_t,
127284555Sarybchik					   size_t);
128293927Sarybchik	efx_rc_t	(*etxo_qpio_post)(efx_txq_t *, size_t, unsigned int,
129284555Sarybchik					   unsigned int *);
130293927Sarybchik	efx_rc_t	(*etxo_qdesc_post)(efx_txq_t *, efx_desc_t *,
131284555Sarybchik				      unsigned int, unsigned int,
132284555Sarybchik				      unsigned int *);
133284555Sarybchik	void		(*etxo_qdesc_dma_create)(efx_txq_t *, efsys_dma_addr_t,
134284555Sarybchik						size_t, boolean_t,
135284555Sarybchik						efx_desc_t *);
136284555Sarybchik	void		(*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t,
137284555Sarybchik						uint32_t, uint8_t,
138284555Sarybchik						efx_desc_t *);
139294381Sarybchik	void		(*etxo_qdesc_tso2_create)(efx_txq_t *, uint16_t,
140294381Sarybchik						uint32_t, uint16_t,
141294381Sarybchik						efx_desc_t *, int);
142284555Sarybchik	void		(*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t,
143284555Sarybchik						efx_desc_t *);
144342509Sarybchik	void		(*etxo_qdesc_checksum_create)(efx_txq_t *, uint16_t,
145342509Sarybchik						efx_desc_t *);
146284555Sarybchik#if EFSYS_OPT_QSTATS
147284555Sarybchik	void		(*etxo_qstats_update)(efx_txq_t *,
148284555Sarybchik					      efsys_stat_t *);
149284555Sarybchik#endif
150284555Sarybchik} efx_tx_ops_t;
151284555Sarybchik
152284555Sarybchiktypedef struct efx_rx_ops_s {
153293927Sarybchik	efx_rc_t	(*erxo_init)(efx_nic_t *);
154284555Sarybchik	void		(*erxo_fini)(efx_nic_t *);
155284555Sarybchik#if EFSYS_OPT_RX_SCATTER
156293927Sarybchik	efx_rc_t	(*erxo_scatter_enable)(efx_nic_t *, unsigned int);
157284555Sarybchik#endif
158284555Sarybchik#if EFSYS_OPT_RX_SCALE
159293927Sarybchik	efx_rc_t	(*erxo_scale_mode_set)(efx_nic_t *, efx_rx_hash_alg_t,
160284555Sarybchik					       efx_rx_hash_type_t, boolean_t);
161293927Sarybchik	efx_rc_t	(*erxo_scale_key_set)(efx_nic_t *, uint8_t *, size_t);
162293927Sarybchik	efx_rc_t	(*erxo_scale_tbl_set)(efx_nic_t *, unsigned int *,
163284555Sarybchik					      size_t);
164294008Sarybchik	uint32_t	(*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t,
165294008Sarybchik					    uint8_t *);
166294008Sarybchik#endif /* EFSYS_OPT_RX_SCALE */
167294008Sarybchik	efx_rc_t	(*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *,
168294008Sarybchik					      uint16_t *);
169284555Sarybchik	void		(*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t,
170284555Sarybchik				      unsigned int, unsigned int,
171284555Sarybchik				      unsigned int);
172284555Sarybchik	void		(*erxo_qpush)(efx_rxq_t *, unsigned int, unsigned int *);
173293927Sarybchik	efx_rc_t	(*erxo_qflush)(efx_rxq_t *);
174284555Sarybchik	void		(*erxo_qenable)(efx_rxq_t *);
175293927Sarybchik	efx_rc_t	(*erxo_qcreate)(efx_nic_t *enp, unsigned int,
176284555Sarybchik					unsigned int, efx_rxq_type_t,
177284555Sarybchik					efsys_mem_t *, size_t, uint32_t,
178284555Sarybchik					efx_evq_t *, efx_rxq_t *);
179284555Sarybchik	void		(*erxo_qdestroy)(efx_rxq_t *);
180284555Sarybchik} efx_rx_ops_t;
181284555Sarybchik
182227569Sphiliptypedef struct efx_mac_ops_s {
183293927Sarybchik	efx_rc_t	(*emo_poll)(efx_nic_t *, efx_link_mode_t *);
184293927Sarybchik	efx_rc_t	(*emo_up)(efx_nic_t *, boolean_t *);
185293927Sarybchik	efx_rc_t	(*emo_addr_set)(efx_nic_t *);
186294397Sarybchik	efx_rc_t	(*emo_pdu_set)(efx_nic_t *);
187301380Sarybchik	efx_rc_t	(*emo_pdu_get)(efx_nic_t *, size_t *);
188293927Sarybchik	efx_rc_t	(*emo_reconfigure)(efx_nic_t *);
189293927Sarybchik	efx_rc_t	(*emo_multicast_list_set)(efx_nic_t *);
190293927Sarybchik	efx_rc_t	(*emo_filter_default_rxq_set)(efx_nic_t *,
191284555Sarybchik						      efx_rxq_t *, boolean_t);
192284555Sarybchik	void		(*emo_filter_default_rxq_clear)(efx_nic_t *);
193227569Sphilip#if EFSYS_OPT_LOOPBACK
194293927Sarybchik	efx_rc_t	(*emo_loopback_set)(efx_nic_t *, efx_link_mode_t,
195227569Sphilip					    efx_loopback_type_t);
196227569Sphilip#endif	/* EFSYS_OPT_LOOPBACK */
197227569Sphilip#if EFSYS_OPT_MAC_STATS
198311080Sarybchik	efx_rc_t	(*emo_stats_get_mask)(efx_nic_t *, uint32_t *, size_t);
199293927Sarybchik	efx_rc_t	(*emo_stats_upload)(efx_nic_t *, efsys_mem_t *);
200293927Sarybchik	efx_rc_t	(*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *,
201227569Sphilip					      uint16_t, boolean_t);
202293927Sarybchik	efx_rc_t	(*emo_stats_update)(efx_nic_t *, efsys_mem_t *,
203227569Sphilip					    efsys_stat_t *, uint32_t *);
204227569Sphilip#endif	/* EFSYS_OPT_MAC_STATS */
205227569Sphilip} efx_mac_ops_t;
206227569Sphilip
207227569Sphiliptypedef struct efx_phy_ops_s {
208293927Sarybchik	efx_rc_t	(*epo_power)(efx_nic_t *, boolean_t); /* optional */
209293927Sarybchik	efx_rc_t	(*epo_reset)(efx_nic_t *);
210293927Sarybchik	efx_rc_t	(*epo_reconfigure)(efx_nic_t *);
211293927Sarybchik	efx_rc_t	(*epo_verify)(efx_nic_t *);
212293927Sarybchik	efx_rc_t	(*epo_oui_get)(efx_nic_t *, uint32_t *);
213227569Sphilip#if EFSYS_OPT_PHY_STATS
214293927Sarybchik	efx_rc_t	(*epo_stats_update)(efx_nic_t *, efsys_mem_t *,
215227569Sphilip					    uint32_t *);
216227569Sphilip#endif	/* EFSYS_OPT_PHY_STATS */
217284555Sarybchik#if EFSYS_OPT_BIST
218293927Sarybchik	efx_rc_t	(*epo_bist_enable_offline)(efx_nic_t *);
219293927Sarybchik	efx_rc_t	(*epo_bist_start)(efx_nic_t *, efx_bist_type_t);
220293927Sarybchik	efx_rc_t	(*epo_bist_poll)(efx_nic_t *, efx_bist_type_t,
221284555Sarybchik					 efx_bist_result_t *, uint32_t *,
222227569Sphilip					 unsigned long *, size_t);
223284555Sarybchik	void		(*epo_bist_stop)(efx_nic_t *, efx_bist_type_t);
224284555Sarybchik#endif	/* EFSYS_OPT_BIST */
225227569Sphilip} efx_phy_ops_t;
226227569Sphilip
227284555Sarybchik#if EFSYS_OPT_FILTER
228284555Sarybchiktypedef struct efx_filter_ops_s {
229293927Sarybchik	efx_rc_t	(*efo_init)(efx_nic_t *);
230293927Sarybchik	void		(*efo_fini)(efx_nic_t *);
231293927Sarybchik	efx_rc_t	(*efo_restore)(efx_nic_t *);
232293927Sarybchik	efx_rc_t	(*efo_add)(efx_nic_t *, efx_filter_spec_t *,
233293927Sarybchik				   boolean_t may_replace);
234293927Sarybchik	efx_rc_t	(*efo_delete)(efx_nic_t *, efx_filter_spec_t *);
235311494Sarybchik	efx_rc_t	(*efo_supported_filters)(efx_nic_t *, uint32_t *,
236311494Sarybchik				   size_t, size_t *);
237293927Sarybchik	efx_rc_t	(*efo_reconfigure)(efx_nic_t *, uint8_t const *, boolean_t,
238284555Sarybchik				   boolean_t, boolean_t, boolean_t,
239301337Sarybchik				   uint8_t const *, uint32_t);
240284555Sarybchik} efx_filter_ops_t;
241284555Sarybchik
242293927Sarybchikextern	__checkReturn	efx_rc_t
243284555Sarybchikefx_filter_reconfigure(
244284555Sarybchik	__in				efx_nic_t *enp,
245284555Sarybchik	__in_ecount(6)			uint8_t const *mac_addr,
246284555Sarybchik	__in				boolean_t all_unicst,
247284555Sarybchik	__in				boolean_t mulcst,
248284555Sarybchik	__in				boolean_t all_mulcst,
249284555Sarybchik	__in				boolean_t brdcst,
250284555Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
251301337Sarybchik	__in				uint32_t count);
252284555Sarybchik
253284555Sarybchik#endif /* EFSYS_OPT_FILTER */
254284555Sarybchik
255284555Sarybchik
256227569Sphiliptypedef struct efx_port_s {
257227569Sphilip	efx_mac_type_t		ep_mac_type;
258311056Sarybchik	uint32_t		ep_phy_type;
259227569Sphilip	uint8_t			ep_port;
260227569Sphilip	uint32_t		ep_mac_pdu;
261227569Sphilip	uint8_t			ep_mac_addr[6];
262227569Sphilip	efx_link_mode_t		ep_link_mode;
263284555Sarybchik	boolean_t		ep_all_unicst;
264284555Sarybchik	boolean_t		ep_mulcst;
265284555Sarybchik	boolean_t		ep_all_mulcst;
266227569Sphilip	boolean_t		ep_brdcst;
267227569Sphilip	unsigned int		ep_fcntl;
268227569Sphilip	boolean_t		ep_fcntl_autoneg;
269227569Sphilip	efx_oword_t		ep_multicst_hash[2];
270284555Sarybchik	uint8_t			ep_mulcst_addr_list[EFX_MAC_ADDR_LEN *
271284555Sarybchik						    EFX_MAC_MULTICAST_LIST_MAX];
272284555Sarybchik	uint32_t		ep_mulcst_addr_count;
273227569Sphilip#if EFSYS_OPT_LOOPBACK
274227569Sphilip	efx_loopback_type_t	ep_loopback_type;
275227569Sphilip	efx_link_mode_t		ep_loopback_link_mode;
276227569Sphilip#endif	/* EFSYS_OPT_LOOPBACK */
277227569Sphilip#if EFSYS_OPT_PHY_FLAGS
278227569Sphilip	uint32_t		ep_phy_flags;
279227569Sphilip#endif	/* EFSYS_OPT_PHY_FLAGS */
280227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL
281227569Sphilip	efx_phy_led_mode_t	ep_phy_led_mode;
282227569Sphilip#endif	/* EFSYS_OPT_PHY_LED_CONTROL */
283227569Sphilip	efx_phy_media_type_t	ep_fixed_port_type;
284227569Sphilip	efx_phy_media_type_t	ep_module_type;
285227569Sphilip	uint32_t		ep_adv_cap_mask;
286227569Sphilip	uint32_t		ep_lp_cap_mask;
287227569Sphilip	uint32_t		ep_default_adv_cap_mask;
288227569Sphilip	uint32_t		ep_phy_cap_mask;
289227569Sphilip	boolean_t		ep_mac_drain;
290284555Sarybchik#if EFSYS_OPT_BIST
291284555Sarybchik	efx_bist_type_t		ep_current_bist;
292227569Sphilip#endif
293301340Sarybchik	const efx_mac_ops_t	*ep_emop;
294301340Sarybchik	const efx_phy_ops_t	*ep_epop;
295227569Sphilip} efx_port_t;
296227569Sphilip
297227569Sphiliptypedef struct efx_mon_ops_s {
298227569Sphilip#if EFSYS_OPT_MON_STATS
299293927Sarybchik	efx_rc_t	(*emo_stats_update)(efx_nic_t *, efsys_mem_t *,
300293927Sarybchik					    efx_mon_stat_value_t *);
301227569Sphilip#endif	/* EFSYS_OPT_MON_STATS */
302227569Sphilip} efx_mon_ops_t;
303227569Sphilip
304227569Sphiliptypedef struct efx_mon_s {
305301340Sarybchik	efx_mon_type_t		em_type;
306301340Sarybchik	const efx_mon_ops_t	*em_emop;
307227569Sphilip} efx_mon_t;
308227569Sphilip
309284555Sarybchiktypedef struct efx_intr_ops_s {
310293927Sarybchik	efx_rc_t	(*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *);
311284555Sarybchik	void		(*eio_enable)(efx_nic_t *);
312284555Sarybchik	void		(*eio_disable)(efx_nic_t *);
313284555Sarybchik	void		(*eio_disable_unlocked)(efx_nic_t *);
314293927Sarybchik	efx_rc_t	(*eio_trigger)(efx_nic_t *, unsigned int);
315294001Sarybchik	void		(*eio_status_line)(efx_nic_t *, boolean_t *, uint32_t *);
316294001Sarybchik	void		(*eio_status_message)(efx_nic_t *, unsigned int,
317294001Sarybchik				 boolean_t *);
318294001Sarybchik	void		(*eio_fatal)(efx_nic_t *);
319284555Sarybchik	void		(*eio_fini)(efx_nic_t *);
320284555Sarybchik} efx_intr_ops_t;
321284555Sarybchik
322227569Sphiliptypedef struct efx_intr_s {
323301340Sarybchik	const efx_intr_ops_t	*ei_eiop;
324301340Sarybchik	efsys_mem_t		*ei_esmp;
325301340Sarybchik	efx_intr_type_t		ei_type;
326301340Sarybchik	unsigned int		ei_level;
327227569Sphilip} efx_intr_t;
328227569Sphilip
329227569Sphiliptypedef struct efx_nic_ops_s {
330293927Sarybchik	efx_rc_t	(*eno_probe)(efx_nic_t *);
331294377Sarybchik	efx_rc_t	(*eno_board_cfg)(efx_nic_t *);
332293927Sarybchik	efx_rc_t	(*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*);
333293927Sarybchik	efx_rc_t	(*eno_reset)(efx_nic_t *);
334293927Sarybchik	efx_rc_t	(*eno_init)(efx_nic_t *);
335293927Sarybchik	efx_rc_t	(*eno_get_vi_pool)(efx_nic_t *, uint32_t *);
336293927Sarybchik	efx_rc_t	(*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t,
337284555Sarybchik					uint32_t *, size_t *);
338227569Sphilip#if EFSYS_OPT_DIAG
339293927Sarybchik	efx_rc_t	(*eno_register_test)(efx_nic_t *);
340227569Sphilip#endif	/* EFSYS_OPT_DIAG */
341293927Sarybchik	void		(*eno_fini)(efx_nic_t *);
342293927Sarybchik	void		(*eno_unprobe)(efx_nic_t *);
343227569Sphilip} efx_nic_ops_t;
344227569Sphilip
345280562Sarybchik#ifndef EFX_TXQ_LIMIT_TARGET
346284555Sarybchik#define	EFX_TXQ_LIMIT_TARGET 259
347280562Sarybchik#endif
348280562Sarybchik#ifndef EFX_RXQ_LIMIT_TARGET
349284555Sarybchik#define	EFX_RXQ_LIMIT_TARGET 512
350280562Sarybchik#endif
351280562Sarybchik#ifndef EFX_TXQ_DC_SIZE
352284555Sarybchik#define	EFX_TXQ_DC_SIZE 1 /* 16 descriptors */
353280562Sarybchik#endif
354280562Sarybchik#ifndef EFX_RXQ_DC_SIZE
355284555Sarybchik#define	EFX_RXQ_DC_SIZE 3 /* 64 descriptors */
356280562Sarybchik#endif
357227569Sphilip
358227569Sphilip#if EFSYS_OPT_FILTER
359227569Sphilip
360301346Sarybchiktypedef struct siena_filter_spec_s {
361301346Sarybchik	uint8_t		sfs_type;
362301346Sarybchik	uint32_t	sfs_flags;
363301346Sarybchik	uint32_t	sfs_dmaq_id;
364301346Sarybchik	uint32_t	sfs_dword[3];
365301346Sarybchik} siena_filter_spec_t;
366227569Sphilip
367301346Sarybchiktypedef enum siena_filter_type_e {
368301346Sarybchik	EFX_SIENA_FILTER_RX_TCP_FULL,	/* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */
369301346Sarybchik	EFX_SIENA_FILTER_RX_TCP_WILD,	/* TCP/IPv4 {dIP,dTCP,  -,   -} */
370301346Sarybchik	EFX_SIENA_FILTER_RX_UDP_FULL,	/* UDP/IPv4 {dIP,dUDP,sIP,sUDP} */
371301346Sarybchik	EFX_SIENA_FILTER_RX_UDP_WILD,	/* UDP/IPv4 {dIP,dUDP,  -,   -} */
372301346Sarybchik	EFX_SIENA_FILTER_RX_MAC_FULL,	/* Ethernet {dMAC,VLAN} */
373301346Sarybchik	EFX_SIENA_FILTER_RX_MAC_WILD,	/* Ethernet {dMAC,   -} */
374284555Sarybchik
375301346Sarybchik	EFX_SIENA_FILTER_TX_TCP_FULL,	/* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */
376301346Sarybchik	EFX_SIENA_FILTER_TX_TCP_WILD,	/* TCP/IPv4 {  -,   -,sIP,sTCP} */
377301346Sarybchik	EFX_SIENA_FILTER_TX_UDP_FULL,	/* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */
378301346Sarybchik	EFX_SIENA_FILTER_TX_UDP_WILD,	/* UDP/IPv4 {  -,   -,sIP,sUDP} */
379301346Sarybchik	EFX_SIENA_FILTER_TX_MAC_FULL,	/* Ethernet {sMAC,VLAN} */
380301346Sarybchik	EFX_SIENA_FILTER_TX_MAC_WILD,	/* Ethernet {sMAC,   -} */
381227569Sphilip
382301346Sarybchik	EFX_SIENA_FILTER_NTYPES
383301346Sarybchik} siena_filter_type_t;
384227569Sphilip
385301346Sarybchiktypedef enum siena_filter_tbl_id_e {
386301346Sarybchik	EFX_SIENA_FILTER_TBL_RX_IP = 0,
387301346Sarybchik	EFX_SIENA_FILTER_TBL_RX_MAC,
388301346Sarybchik	EFX_SIENA_FILTER_TBL_TX_IP,
389301346Sarybchik	EFX_SIENA_FILTER_TBL_TX_MAC,
390301346Sarybchik	EFX_SIENA_FILTER_NTBLS
391301346Sarybchik} siena_filter_tbl_id_t;
392227569Sphilip
393301346Sarybchiktypedef struct siena_filter_tbl_s {
394301346Sarybchik	int			sft_size;	/* number of entries */
395301346Sarybchik	int			sft_used;	/* active count */
396301346Sarybchik	uint32_t		*sft_bitmap;	/* active bitmap */
397301346Sarybchik	siena_filter_spec_t	*sft_spec;	/* array of saved specs */
398301346Sarybchik} siena_filter_tbl_t;
399227569Sphilip
400301346Sarybchiktypedef struct siena_filter_s {
401301346Sarybchik	siena_filter_tbl_t	sf_tbl[EFX_SIENA_FILTER_NTBLS];
402301346Sarybchik	unsigned int		sf_depth[EFX_SIENA_FILTER_NTYPES];
403301346Sarybchik} siena_filter_t;
404227569Sphilip
405227569Sphiliptypedef struct efx_filter_s {
406301324Sarybchik#if EFSYS_OPT_SIENA
407301346Sarybchik	siena_filter_t		*ef_siena_filter;
408301324Sarybchik#endif /* EFSYS_OPT_SIENA */
409293996Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
410293996Sarybchik	ef10_filter_table_t	*ef_ef10_filter_table;
411293996Sarybchik#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
412227569Sphilip} efx_filter_t;
413227569Sphilip
414284555Sarybchikextern			void
415301345Sarybchiksiena_filter_tbl_clear(
416227569Sphilip	__in		efx_nic_t *enp,
417301346Sarybchik	__in		siena_filter_tbl_id_t tbl);
418227569Sphilip
419284555Sarybchik#endif	/* EFSYS_OPT_FILTER */
420227569Sphilip
421284555Sarybchik#if EFSYS_OPT_MCDI
422227569Sphilip
423284555Sarybchiktypedef struct efx_mcdi_ops_s {
424293927Sarybchik	efx_rc_t	(*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *);
425294378Sarybchik	void		(*emco_send_request)(efx_nic_t *, void *, size_t,
426294378Sarybchik					void *, size_t);
427293927Sarybchik	efx_rc_t	(*emco_poll_reboot)(efx_nic_t *);
428293972Sarybchik	boolean_t	(*emco_poll_response)(efx_nic_t *);
429293972Sarybchik	void		(*emco_read_response)(efx_nic_t *, void *, size_t, size_t);
430284555Sarybchik	void		(*emco_fini)(efx_nic_t *);
431311496Sarybchik	efx_rc_t	(*emco_feature_supported)(efx_nic_t *,
432311496Sarybchik					    efx_mcdi_feature_id_t, boolean_t *);
433311496Sarybchik	void		(*emco_get_timeout)(efx_nic_t *, efx_mcdi_req_t *,
434311496Sarybchik					    uint32_t *);
435284555Sarybchik} efx_mcdi_ops_t;
436227569Sphilip
437284555Sarybchiktypedef struct efx_mcdi_s {
438301340Sarybchik	const efx_mcdi_ops_t		*em_emcop;
439284555Sarybchik	const efx_mcdi_transport_t	*em_emtp;
440284555Sarybchik	efx_mcdi_iface_t		em_emip;
441284555Sarybchik} efx_mcdi_t;
442227569Sphilip
443284555Sarybchik#endif /* EFSYS_OPT_MCDI */
444227569Sphilip
445227569Sphilip#if EFSYS_OPT_NVRAM
446227569Sphiliptypedef struct efx_nvram_ops_s {
447227569Sphilip#if EFSYS_OPT_DIAG
448293927Sarybchik	efx_rc_t	(*envo_test)(efx_nic_t *);
449227569Sphilip#endif	/* EFSYS_OPT_DIAG */
450294379Sarybchik	efx_rc_t	(*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t,
451294379Sarybchik					    uint32_t *);
452294379Sarybchik	efx_rc_t	(*envo_partn_size)(efx_nic_t *, uint32_t, size_t *);
453294379Sarybchik	efx_rc_t	(*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *);
454294379Sarybchik	efx_rc_t	(*envo_partn_read)(efx_nic_t *, uint32_t,
455293927Sarybchik					    unsigned int, caddr_t, size_t);
456294379Sarybchik	efx_rc_t	(*envo_partn_erase)(efx_nic_t *, uint32_t,
457294379Sarybchik					    unsigned int, size_t);
458294379Sarybchik	efx_rc_t	(*envo_partn_write)(efx_nic_t *, uint32_t,
459293927Sarybchik					    unsigned int, caddr_t, size_t);
460311495Sarybchik	efx_rc_t	(*envo_partn_rw_finish)(efx_nic_t *, uint32_t);
461294379Sarybchik	efx_rc_t	(*envo_partn_get_version)(efx_nic_t *, uint32_t,
462294379Sarybchik					    uint32_t *, uint16_t *);
463294379Sarybchik	efx_rc_t	(*envo_partn_set_version)(efx_nic_t *, uint32_t,
464293927Sarybchik					    uint16_t *);
465301321Sarybchik	efx_rc_t	(*envo_buffer_validate)(efx_nic_t *, uint32_t,
466301321Sarybchik					    caddr_t, size_t);
467227569Sphilip} efx_nvram_ops_t;
468227569Sphilip#endif /* EFSYS_OPT_NVRAM */
469227569Sphilip
470227569Sphilip#if EFSYS_OPT_VPD
471227569Sphiliptypedef struct efx_vpd_ops_s {
472293927Sarybchik	efx_rc_t	(*evpdo_init)(efx_nic_t *);
473293927Sarybchik	efx_rc_t	(*evpdo_size)(efx_nic_t *, size_t *);
474293927Sarybchik	efx_rc_t	(*evpdo_read)(efx_nic_t *, caddr_t, size_t);
475293927Sarybchik	efx_rc_t	(*evpdo_verify)(efx_nic_t *, caddr_t, size_t);
476293927Sarybchik	efx_rc_t	(*evpdo_reinit)(efx_nic_t *, caddr_t, size_t);
477293927Sarybchik	efx_rc_t	(*evpdo_get)(efx_nic_t *, caddr_t, size_t,
478293927Sarybchik					efx_vpd_value_t *);
479293927Sarybchik	efx_rc_t	(*evpdo_set)(efx_nic_t *, caddr_t, size_t,
480293927Sarybchik					efx_vpd_value_t *);
481293927Sarybchik	efx_rc_t	(*evpdo_next)(efx_nic_t *, caddr_t, size_t,
482293927Sarybchik					efx_vpd_value_t *, unsigned int *);
483293927Sarybchik	efx_rc_t	(*evpdo_write)(efx_nic_t *, caddr_t, size_t);
484293927Sarybchik	void		(*evpdo_fini)(efx_nic_t *);
485227569Sphilip} efx_vpd_ops_t;
486227569Sphilip#endif	/* EFSYS_OPT_VPD */
487227569Sphilip
488284555Sarybchik#if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
489284555Sarybchik
490293927Sarybchik	__checkReturn		efx_rc_t
491284555Sarybchikefx_mcdi_nvram_partitions(
492284555Sarybchik	__in			efx_nic_t *enp,
493284555Sarybchik	__out_bcount(size)	caddr_t data,
494284555Sarybchik	__in			size_t size,
495284555Sarybchik	__out			unsigned int *npartnp);
496284555Sarybchik
497293927Sarybchik	__checkReturn		efx_rc_t
498284555Sarybchikefx_mcdi_nvram_metadata(
499284555Sarybchik	__in			efx_nic_t *enp,
500284555Sarybchik	__in			uint32_t partn,
501284555Sarybchik	__out			uint32_t *subtypep,
502284555Sarybchik	__out_ecount(4)		uint16_t version[4],
503284555Sarybchik	__out_bcount_opt(size)	char *descp,
504284555Sarybchik	__in			size_t size);
505284555Sarybchik
506293927Sarybchik	__checkReturn		efx_rc_t
507284555Sarybchikefx_mcdi_nvram_info(
508284555Sarybchik	__in			efx_nic_t *enp,
509284555Sarybchik	__in			uint32_t partn,
510284555Sarybchik	__out_opt		size_t *sizep,
511284555Sarybchik	__out_opt		uint32_t *addressp,
512293944Sarybchik	__out_opt		uint32_t *erase_sizep,
513293944Sarybchik	__out_opt		uint32_t *write_sizep);
514284555Sarybchik
515293927Sarybchik	__checkReturn		efx_rc_t
516284555Sarybchikefx_mcdi_nvram_update_start(
517284555Sarybchik	__in			efx_nic_t *enp,
518284555Sarybchik	__in			uint32_t partn);
519284555Sarybchik
520293927Sarybchik	__checkReturn		efx_rc_t
521284555Sarybchikefx_mcdi_nvram_read(
522284555Sarybchik	__in			efx_nic_t *enp,
523284555Sarybchik	__in			uint32_t partn,
524284555Sarybchik	__in			uint32_t offset,
525284555Sarybchik	__out_bcount(size)	caddr_t data,
526294403Sarybchik	__in			size_t size,
527294403Sarybchik	__in			uint32_t mode);
528284555Sarybchik
529293927Sarybchik	__checkReturn		efx_rc_t
530284555Sarybchikefx_mcdi_nvram_erase(
531284555Sarybchik	__in			efx_nic_t *enp,
532284555Sarybchik	__in			uint32_t partn,
533284555Sarybchik	__in			uint32_t offset,
534284555Sarybchik	__in			size_t size);
535284555Sarybchik
536293927Sarybchik	__checkReturn		efx_rc_t
537284555Sarybchikefx_mcdi_nvram_write(
538284555Sarybchik	__in			efx_nic_t *enp,
539284555Sarybchik	__in			uint32_t partn,
540284555Sarybchik	__in			uint32_t offset,
541342512Sarybchik	__in_bcount(size)	caddr_t data,
542284555Sarybchik	__in			size_t size);
543284555Sarybchik
544293927Sarybchik	__checkReturn		efx_rc_t
545284555Sarybchikefx_mcdi_nvram_update_finish(
546284555Sarybchik	__in			efx_nic_t *enp,
547284555Sarybchik	__in			uint32_t partn,
548311495Sarybchik	__in			boolean_t reboot,
549311495Sarybchik	__out_opt		uint32_t *resultp);
550284555Sarybchik
551284555Sarybchik#if EFSYS_OPT_DIAG
552284555Sarybchik
553293927Sarybchik	__checkReturn		efx_rc_t
554284555Sarybchikefx_mcdi_nvram_test(
555284555Sarybchik	__in			efx_nic_t *enp,
556284555Sarybchik	__in			uint32_t partn);
557284555Sarybchik
558284555Sarybchik#endif	/* EFSYS_OPT_DIAG */
559284555Sarybchik
560284555Sarybchik#endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
561284555Sarybchik
562294386Sarybchik#if EFSYS_OPT_LICENSING
563294386Sarybchik
564294386Sarybchiktypedef struct efx_lic_ops_s {
565294386Sarybchik	efx_rc_t	(*elo_update_licenses)(efx_nic_t *);
566294386Sarybchik	efx_rc_t	(*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *);
567294386Sarybchik	efx_rc_t	(*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *);
568294386Sarybchik	efx_rc_t	(*elo_get_id)(efx_nic_t *, size_t, uint32_t *,
569294386Sarybchik				      size_t *, uint8_t *);
570301361Sarybchik	efx_rc_t	(*elo_find_start)
571301361Sarybchik				(efx_nic_t *, caddr_t, size_t, uint32_t *);
572301361Sarybchik	efx_rc_t	(*elo_find_end)(efx_nic_t *, caddr_t, size_t,
573310842Sarybchik				uint32_t, uint32_t *);
574301361Sarybchik	boolean_t	(*elo_find_key)(efx_nic_t *, caddr_t, size_t,
575301361Sarybchik				uint32_t, uint32_t *, uint32_t *);
576301361Sarybchik	boolean_t	(*elo_validate_key)(efx_nic_t *,
577301361Sarybchik				caddr_t, uint32_t);
578301361Sarybchik	efx_rc_t	(*elo_read_key)(efx_nic_t *,
579301361Sarybchik				caddr_t, size_t, uint32_t, uint32_t,
580301361Sarybchik				caddr_t, size_t, uint32_t *);
581301361Sarybchik	efx_rc_t	(*elo_write_key)(efx_nic_t *,
582301361Sarybchik				caddr_t, size_t, uint32_t,
583301361Sarybchik				caddr_t, uint32_t, uint32_t *);
584301361Sarybchik	efx_rc_t	(*elo_delete_key)(efx_nic_t *,
585301361Sarybchik				caddr_t, size_t, uint32_t,
586301361Sarybchik				uint32_t, uint32_t, uint32_t *);
587301361Sarybchik	efx_rc_t	(*elo_create_partition)(efx_nic_t *,
588301361Sarybchik				caddr_t, size_t);
589301361Sarybchik	efx_rc_t	(*elo_finish_partition)(efx_nic_t *,
590301361Sarybchik				caddr_t, size_t);
591294386Sarybchik} efx_lic_ops_t;
592294386Sarybchik
593294386Sarybchik#endif
594294386Sarybchik
595284555Sarybchiktypedef struct efx_drv_cfg_s {
596284555Sarybchik	uint32_t		edc_min_vi_count;
597284555Sarybchik	uint32_t		edc_max_vi_count;
598284555Sarybchik
599284555Sarybchik	uint32_t		edc_max_piobuf_count;
600284555Sarybchik	uint32_t		edc_pio_alloc_size;
601284555Sarybchik} efx_drv_cfg_t;
602284555Sarybchik
603227569Sphilipstruct efx_nic_s {
604227569Sphilip	uint32_t		en_magic;
605227569Sphilip	efx_family_t		en_family;
606227569Sphilip	uint32_t		en_features;
607227569Sphilip	efsys_identifier_t	*en_esip;
608227569Sphilip	efsys_lock_t		*en_eslp;
609311056Sarybchik	efsys_bar_t		*en_esbp;
610227569Sphilip	unsigned int		en_mod_flags;
611227569Sphilip	unsigned int		en_reset_flags;
612227569Sphilip	efx_nic_cfg_t		en_nic_cfg;
613284555Sarybchik	efx_drv_cfg_t		en_drv_cfg;
614227569Sphilip	efx_port_t		en_port;
615227569Sphilip	efx_mon_t		en_mon;
616227569Sphilip	efx_intr_t		en_intr;
617227569Sphilip	uint32_t		en_ev_qcount;
618227569Sphilip	uint32_t		en_rx_qcount;
619227569Sphilip	uint32_t		en_tx_qcount;
620301340Sarybchik	const efx_nic_ops_t	*en_enop;
621301340Sarybchik	const efx_ev_ops_t	*en_eevop;
622301340Sarybchik	const efx_tx_ops_t	*en_etxop;
623301340Sarybchik	const efx_rx_ops_t	*en_erxop;
624227569Sphilip#if EFSYS_OPT_FILTER
625227569Sphilip	efx_filter_t		en_filter;
626301340Sarybchik	const efx_filter_ops_t	*en_efop;
627227569Sphilip#endif	/* EFSYS_OPT_FILTER */
628284555Sarybchik#if EFSYS_OPT_MCDI
629284555Sarybchik	efx_mcdi_t		en_mcdi;
630284555Sarybchik#endif	/* EFSYS_OPT_MCDI */
631227569Sphilip#if EFSYS_OPT_NVRAM
632227569Sphilip	efx_nvram_type_t	en_nvram_locked;
633301340Sarybchik	const efx_nvram_ops_t	*en_envop;
634227569Sphilip#endif	/* EFSYS_OPT_NVRAM */
635227569Sphilip#if EFSYS_OPT_VPD
636301340Sarybchik	const efx_vpd_ops_t	*en_evpdop;
637227569Sphilip#endif	/* EFSYS_OPT_VPD */
638284555Sarybchik#if EFSYS_OPT_RX_SCALE
639284555Sarybchik	efx_rx_hash_support_t	en_hash_support;
640284555Sarybchik	efx_rx_scale_support_t	en_rss_support;
641284555Sarybchik	uint32_t		en_rss_context;
642284555Sarybchik#endif	/* EFSYS_OPT_RX_SCALE */
643284555Sarybchik	uint32_t		en_vport_id;
644294386Sarybchik#if EFSYS_OPT_LICENSING
645301340Sarybchik	const efx_lic_ops_t	*en_elop;
646301379Sarybchik	boolean_t		en_licensing_supported;
647294386Sarybchik#endif
648227569Sphilip	union {
649227569Sphilip#if EFSYS_OPT_SIENA
650227569Sphilip		struct {
651227569Sphilip#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
652227569Sphilip			unsigned int		enu_partn_mask;
653227569Sphilip#endif	/* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
654227569Sphilip#if EFSYS_OPT_VPD
655227569Sphilip			caddr_t			enu_svpd;
656227569Sphilip			size_t			enu_svpd_length;
657227569Sphilip#endif	/* EFSYS_OPT_VPD */
658284555Sarybchik			int			enu_unused;
659227569Sphilip		} siena;
660227569Sphilip#endif	/* EFSYS_OPT_SIENA */
661293982Sarybchik		int	enu_unused;
662293982Sarybchik	} en_u;
663293982Sarybchik#if (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD)
664293982Sarybchik	union en_arch {
665284555Sarybchik		struct {
666293982Sarybchik			int			ena_vi_base;
667293982Sarybchik			int			ena_vi_count;
668294009Sarybchik			int			ena_vi_shift;
669284555Sarybchik#if EFSYS_OPT_VPD
670293982Sarybchik			caddr_t			ena_svpd;
671293982Sarybchik			size_t			ena_svpd_length;
672284555Sarybchik#endif	/* EFSYS_OPT_VPD */
673293982Sarybchik			efx_piobuf_handle_t	ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS];
674293982Sarybchik			uint32_t		ena_piobuf_count;
675293982Sarybchik			uint32_t		ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS];
676293982Sarybchik			uint32_t		ena_pio_write_vi_base;
677284555Sarybchik			/* Memory BAR mapping regions */
678293982Sarybchik			uint32_t		ena_uc_mem_map_offset;
679293982Sarybchik			size_t			ena_uc_mem_map_size;
680293982Sarybchik			uint32_t		ena_wc_mem_map_offset;
681293982Sarybchik			size_t			ena_wc_mem_map_size;
682293982Sarybchik		} ef10;
683293982Sarybchik	} en_arch;
684293982Sarybchik#endif	/* (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */
685227569Sphilip};
686227569Sphilip
687227569Sphilip
688227569Sphilip#define	EFX_NIC_MAGIC	0x02121996
689227569Sphilip
690227569Sphiliptypedef	boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *,
691227569Sphilip    const efx_ev_callbacks_t *, void *);
692227569Sphilip
693284555Sarybchiktypedef struct efx_evq_rxq_state_s {
694284555Sarybchik	unsigned int			eers_rx_read_ptr;
695284555Sarybchik	unsigned int			eers_rx_mask;
696284555Sarybchik} efx_evq_rxq_state_t;
697284555Sarybchik
698227569Sphilipstruct efx_evq_s {
699227569Sphilip	uint32_t			ee_magic;
700227569Sphilip	efx_nic_t			*ee_enp;
701227569Sphilip	unsigned int			ee_index;
702227569Sphilip	unsigned int			ee_mask;
703227569Sphilip	efsys_mem_t			*ee_esmp;
704227569Sphilip#if EFSYS_OPT_QSTATS
705227569Sphilip	uint32_t			ee_stat[EV_NQSTATS];
706227569Sphilip#endif	/* EFSYS_OPT_QSTATS */
707284555Sarybchik
708284555Sarybchik	efx_ev_handler_t		ee_rx;
709284555Sarybchik	efx_ev_handler_t		ee_tx;
710284555Sarybchik	efx_ev_handler_t		ee_driver;
711284555Sarybchik	efx_ev_handler_t		ee_global;
712284555Sarybchik	efx_ev_handler_t		ee_drv_gen;
713284555Sarybchik#if EFSYS_OPT_MCDI
714284555Sarybchik	efx_ev_handler_t		ee_mcdi;
715284555Sarybchik#endif	/* EFSYS_OPT_MCDI */
716284555Sarybchik
717284555Sarybchik	efx_evq_rxq_state_t		ee_rxq_state[EFX_EV_RX_NLABELS];
718311094Sarybchik
719311094Sarybchik	uint32_t			ee_flags;
720227569Sphilip};
721227569Sphilip
722227569Sphilip#define	EFX_EVQ_MAGIC	0x08081997
723227569Sphilip
724280588Sarybchik#define	EFX_EVQ_SIENA_TIMER_QUANTUM_NS	6144 /* 768 cycles */
725227569Sphilip
726227569Sphilipstruct efx_rxq_s {
727227569Sphilip	uint32_t			er_magic;
728227569Sphilip	efx_nic_t			*er_enp;
729284555Sarybchik	efx_evq_t			*er_eep;
730227569Sphilip	unsigned int			er_index;
731284555Sarybchik	unsigned int			er_label;
732227569Sphilip	unsigned int			er_mask;
733227569Sphilip	efsys_mem_t			*er_esmp;
734227569Sphilip};
735227569Sphilip
736227569Sphilip#define	EFX_RXQ_MAGIC	0x15022005
737227569Sphilip
738227569Sphilipstruct efx_txq_s {
739227569Sphilip	uint32_t			et_magic;
740227569Sphilip	efx_nic_t			*et_enp;
741227569Sphilip	unsigned int			et_index;
742227569Sphilip	unsigned int			et_mask;
743227569Sphilip	efsys_mem_t			*et_esmp;
744284555Sarybchik#if EFSYS_OPT_HUNTINGTON
745284555Sarybchik	uint32_t			et_pio_bufnum;
746284555Sarybchik	uint32_t			et_pio_blknum;
747284555Sarybchik	uint32_t			et_pio_write_offset;
748284555Sarybchik	uint32_t			et_pio_offset;
749284555Sarybchik	size_t				et_pio_size;
750284555Sarybchik#endif
751227569Sphilip#if EFSYS_OPT_QSTATS
752227569Sphilip	uint32_t			et_stat[TX_NQSTATS];
753227569Sphilip#endif	/* EFSYS_OPT_QSTATS */
754227569Sphilip};
755227569Sphilip
756227569Sphilip#define	EFX_TXQ_MAGIC	0x05092005
757227569Sphilip
758227569Sphilip#define	EFX_MAC_ADDR_COPY(_dst, _src)					\
759227569Sphilip	do {								\
760227569Sphilip		(_dst)[0] = (_src)[0];					\
761227569Sphilip		(_dst)[1] = (_src)[1];					\
762227569Sphilip		(_dst)[2] = (_src)[2];					\
763227569Sphilip		(_dst)[3] = (_src)[3];					\
764227569Sphilip		(_dst)[4] = (_src)[4];					\
765227569Sphilip		(_dst)[5] = (_src)[5];					\
766227569Sphilip	_NOTE(CONSTANTCONDITION)					\
767227569Sphilip	} while (B_FALSE)
768227569Sphilip
769284555Sarybchik#define	EFX_MAC_BROADCAST_ADDR_SET(_dst)				\
770284555Sarybchik	do {								\
771284555Sarybchik		uint16_t *_d = (uint16_t *)(_dst);			\
772284555Sarybchik		_d[0] = 0xffff;						\
773284555Sarybchik		_d[1] = 0xffff;						\
774284555Sarybchik		_d[2] = 0xffff;						\
775284555Sarybchik	_NOTE(CONSTANTCONDITION)					\
776284555Sarybchik	} while (B_FALSE)
777284555Sarybchik
778227569Sphilip#if EFSYS_OPT_CHECK_REG
779227569Sphilip#define	EFX_CHECK_REG(_enp, _reg)					\
780227569Sphilip	do {								\
781284555Sarybchik		const char *name = #_reg;				\
782227569Sphilip		char min = name[4];					\
783227569Sphilip		char max = name[5];					\
784227569Sphilip		char rev;						\
785227569Sphilip									\
786227569Sphilip		switch ((_enp)->en_family) {				\
787227569Sphilip		case EFX_FAMILY_SIENA:					\
788227569Sphilip			rev = 'C';					\
789227569Sphilip			break;						\
790227569Sphilip									\
791284555Sarybchik		case EFX_FAMILY_HUNTINGTON:				\
792284555Sarybchik			rev = 'D';					\
793284555Sarybchik			break;						\
794284555Sarybchik									\
795293975Sarybchik		case EFX_FAMILY_MEDFORD:				\
796293975Sarybchik			rev = 'E';					\
797293975Sarybchik			break;						\
798293975Sarybchik									\
799227569Sphilip		default:						\
800227569Sphilip			rev = '?';					\
801227569Sphilip			break;						\
802227569Sphilip		}							\
803227569Sphilip									\
804227569Sphilip		EFSYS_ASSERT3S(rev, >=, min);				\
805227569Sphilip		EFSYS_ASSERT3S(rev, <=, max);				\
806227569Sphilip									\
807227569Sphilip	_NOTE(CONSTANTCONDITION)					\
808227569Sphilip	} while (B_FALSE)
809227569Sphilip#else
810227569Sphilip#define	EFX_CHECK_REG(_enp, _reg) do {					\
811227569Sphilip	_NOTE(CONSTANTCONDITION)					\
812311063Sarybchik	} while (B_FALSE)
813227569Sphilip#endif
814227569Sphilip
815227569Sphilip#define	EFX_BAR_READD(_enp, _reg, _edp, _lock)				\
816227569Sphilip	do {								\
817227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
818227569Sphilip		EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST,		\
819227569Sphilip		    (_edp), (_lock));					\
820227569Sphilip		EFSYS_PROBE3(efx_bar_readd, const char *, #_reg,	\
821227569Sphilip		    uint32_t, _reg ## _OFST,				\
822227569Sphilip		    uint32_t, (_edp)->ed_u32[0]);			\
823227569Sphilip	_NOTE(CONSTANTCONDITION)					\
824227569Sphilip	} while (B_FALSE)
825227569Sphilip
826227569Sphilip#define	EFX_BAR_WRITED(_enp, _reg, _edp, _lock)				\
827227569Sphilip	do {								\
828227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
829227569Sphilip		EFSYS_PROBE3(efx_bar_writed, const char *, #_reg,	\
830227569Sphilip		    uint32_t, _reg ## _OFST,				\
831227569Sphilip		    uint32_t, (_edp)->ed_u32[0]);			\
832227569Sphilip		EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST,	\
833227569Sphilip		    (_edp), (_lock));					\
834227569Sphilip	_NOTE(CONSTANTCONDITION)					\
835227569Sphilip	} while (B_FALSE)
836227569Sphilip
837227569Sphilip#define	EFX_BAR_READQ(_enp, _reg, _eqp)					\
838227569Sphilip	do {								\
839227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
840227569Sphilip		EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST,		\
841227569Sphilip		    (_eqp));						\
842227569Sphilip		EFSYS_PROBE4(efx_bar_readq, const char *, #_reg,	\
843227569Sphilip		    uint32_t, _reg ## _OFST,				\
844227569Sphilip		    uint32_t, (_eqp)->eq_u32[1],			\
845227569Sphilip		    uint32_t, (_eqp)->eq_u32[0]);			\
846227569Sphilip	_NOTE(CONSTANTCONDITION)					\
847227569Sphilip	} while (B_FALSE)
848227569Sphilip
849227569Sphilip#define	EFX_BAR_WRITEQ(_enp, _reg, _eqp)				\
850227569Sphilip	do {								\
851227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
852227569Sphilip		EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg,	\
853227569Sphilip		    uint32_t, _reg ## _OFST,				\
854227569Sphilip		    uint32_t, (_eqp)->eq_u32[1],			\
855227569Sphilip		    uint32_t, (_eqp)->eq_u32[0]);			\
856227569Sphilip		EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST,	\
857227569Sphilip		    (_eqp));						\
858227569Sphilip	_NOTE(CONSTANTCONDITION)					\
859227569Sphilip	} while (B_FALSE)
860227569Sphilip
861227569Sphilip#define	EFX_BAR_READO(_enp, _reg, _eop)					\
862227569Sphilip	do {								\
863227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
864227569Sphilip		EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST,		\
865227569Sphilip		    (_eop), B_TRUE);					\
866227569Sphilip		EFSYS_PROBE6(efx_bar_reado, const char *, #_reg,	\
867227569Sphilip		    uint32_t, _reg ## _OFST,				\
868227569Sphilip		    uint32_t, (_eop)->eo_u32[3],			\
869227569Sphilip		    uint32_t, (_eop)->eo_u32[2],			\
870227569Sphilip		    uint32_t, (_eop)->eo_u32[1],			\
871227569Sphilip		    uint32_t, (_eop)->eo_u32[0]);			\
872227569Sphilip	_NOTE(CONSTANTCONDITION)					\
873227569Sphilip	} while (B_FALSE)
874227569Sphilip
875227569Sphilip#define	EFX_BAR_WRITEO(_enp, _reg, _eop)				\
876227569Sphilip	do {								\
877227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
878227569Sphilip		EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg,	\
879227569Sphilip		    uint32_t, _reg ## _OFST,				\
880227569Sphilip		    uint32_t, (_eop)->eo_u32[3],			\
881227569Sphilip		    uint32_t, (_eop)->eo_u32[2],			\
882227569Sphilip		    uint32_t, (_eop)->eo_u32[1],			\
883227569Sphilip		    uint32_t, (_eop)->eo_u32[0]);			\
884227569Sphilip		EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST,	\
885227569Sphilip		    (_eop), B_TRUE);					\
886227569Sphilip	_NOTE(CONSTANTCONDITION)					\
887227569Sphilip	} while (B_FALSE)
888227569Sphilip
889227569Sphilip#define	EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock)		\
890227569Sphilip	do {								\
891227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
892227569Sphilip		EFSYS_BAR_READD((_enp)->en_esbp,			\
893227569Sphilip		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
894227569Sphilip		    (_edp), (_lock));					\
895227569Sphilip		EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg,	\
896227569Sphilip		    uint32_t, (_index),					\
897227569Sphilip		    uint32_t, _reg ## _OFST,				\
898227569Sphilip		    uint32_t, (_edp)->ed_u32[0]);			\
899227569Sphilip	_NOTE(CONSTANTCONDITION)					\
900227569Sphilip	} while (B_FALSE)
901227569Sphilip
902227569Sphilip#define	EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock)		\
903227569Sphilip	do {								\
904227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
905227569Sphilip		EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg,	\
906227569Sphilip		    uint32_t, (_index),					\
907227569Sphilip		    uint32_t, _reg ## _OFST,				\
908227569Sphilip		    uint32_t, (_edp)->ed_u32[0]);			\
909227569Sphilip		EFSYS_BAR_WRITED((_enp)->en_esbp,			\
910227569Sphilip		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
911227569Sphilip		    (_edp), (_lock));					\
912227569Sphilip	_NOTE(CONSTANTCONDITION)					\
913227569Sphilip	} while (B_FALSE)
914227569Sphilip
915284555Sarybchik#define	EFX_BAR_TBL_WRITED2(_enp, _reg, _index, _edp, _lock)		\
916284555Sarybchik	do {								\
917284555Sarybchik		EFX_CHECK_REG((_enp), (_reg));				\
918284555Sarybchik		EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg,	\
919284555Sarybchik		    uint32_t, (_index),					\
920284555Sarybchik		    uint32_t, _reg ## _OFST,				\
921284555Sarybchik		    uint32_t, (_edp)->ed_u32[0]);			\
922284555Sarybchik		EFSYS_BAR_WRITED((_enp)->en_esbp,			\
923284555Sarybchik		    (_reg ## _OFST +					\
924311058Sarybchik		    (2 * sizeof (efx_dword_t)) +			\
925284555Sarybchik		    ((_index) * _reg ## _STEP)),			\
926284555Sarybchik		    (_edp), (_lock));					\
927284555Sarybchik	_NOTE(CONSTANTCONDITION)					\
928284555Sarybchik	} while (B_FALSE)
929284555Sarybchik
930227569Sphilip#define	EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock)		\
931227569Sphilip	do {								\
932227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
933227569Sphilip		EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg,	\
934227569Sphilip		    uint32_t, (_index),					\
935227569Sphilip		    uint32_t, _reg ## _OFST,				\
936227569Sphilip		    uint32_t, (_edp)->ed_u32[0]);			\
937227569Sphilip		EFSYS_BAR_WRITED((_enp)->en_esbp,			\
938227569Sphilip		    (_reg ## _OFST +					\
939311058Sarybchik		    (3 * sizeof (efx_dword_t)) +			\
940227569Sphilip		    ((_index) * _reg ## _STEP)),			\
941227569Sphilip		    (_edp), (_lock));					\
942227569Sphilip	_NOTE(CONSTANTCONDITION)					\
943227569Sphilip	} while (B_FALSE)
944227569Sphilip
945227569Sphilip#define	EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp)			\
946227569Sphilip	do {								\
947227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
948227569Sphilip		EFSYS_BAR_READQ((_enp)->en_esbp,			\
949227569Sphilip		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
950227569Sphilip		    (_eqp));						\
951227569Sphilip		EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg,	\
952227569Sphilip		    uint32_t, (_index),					\
953227569Sphilip		    uint32_t, _reg ## _OFST,				\
954227569Sphilip		    uint32_t, (_eqp)->eq_u32[1],			\
955227569Sphilip		    uint32_t, (_eqp)->eq_u32[0]);			\
956227569Sphilip	_NOTE(CONSTANTCONDITION)					\
957227569Sphilip	} while (B_FALSE)
958227569Sphilip
959227569Sphilip#define	EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp)			\
960227569Sphilip	do {								\
961227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
962227569Sphilip		EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg,	\
963227569Sphilip		    uint32_t, (_index),					\
964227569Sphilip		    uint32_t, _reg ## _OFST,				\
965227569Sphilip		    uint32_t, (_eqp)->eq_u32[1],			\
966227569Sphilip		    uint32_t, (_eqp)->eq_u32[0]);			\
967227569Sphilip		EFSYS_BAR_WRITEQ((_enp)->en_esbp,			\
968227569Sphilip		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
969227569Sphilip		    (_eqp));						\
970227569Sphilip	_NOTE(CONSTANTCONDITION)					\
971227569Sphilip	} while (B_FALSE)
972227569Sphilip
973284555Sarybchik#define	EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock)		\
974227569Sphilip	do {								\
975227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
976227569Sphilip		EFSYS_BAR_READO((_enp)->en_esbp,			\
977227569Sphilip		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
978284555Sarybchik		    (_eop), (_lock));					\
979227569Sphilip		EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg,	\
980227569Sphilip		    uint32_t, (_index),					\
981227569Sphilip		    uint32_t, _reg ## _OFST,				\
982227569Sphilip		    uint32_t, (_eop)->eo_u32[3],			\
983227569Sphilip		    uint32_t, (_eop)->eo_u32[2],			\
984227569Sphilip		    uint32_t, (_eop)->eo_u32[1],			\
985227569Sphilip		    uint32_t, (_eop)->eo_u32[0]);			\
986227569Sphilip	_NOTE(CONSTANTCONDITION)					\
987227569Sphilip	} while (B_FALSE)
988227569Sphilip
989284555Sarybchik#define	EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock)		\
990227569Sphilip	do {								\
991227569Sphilip		EFX_CHECK_REG((_enp), (_reg));				\
992227569Sphilip		EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg,	\
993227569Sphilip		    uint32_t, (_index),					\
994227569Sphilip		    uint32_t, _reg ## _OFST,				\
995227569Sphilip		    uint32_t, (_eop)->eo_u32[3],			\
996227569Sphilip		    uint32_t, (_eop)->eo_u32[2],			\
997227569Sphilip		    uint32_t, (_eop)->eo_u32[1],			\
998227569Sphilip		    uint32_t, (_eop)->eo_u32[0]);			\
999227569Sphilip		EFSYS_BAR_WRITEO((_enp)->en_esbp,			\
1000227569Sphilip		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
1001284555Sarybchik		    (_eop), (_lock));					\
1002227569Sphilip	_NOTE(CONSTANTCONDITION)					\
1003227569Sphilip	} while (B_FALSE)
1004227569Sphilip
1005284555Sarybchik/*
1006284555Sarybchik * Allow drivers to perform optimised 128-bit doorbell writes.
1007284555Sarybchik * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are
1008284555Sarybchik * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid
1009284555Sarybchik * the need for locking in the host, and are the only ones known to be safe to
1010284555Sarybchik * use 128-bites write with.
1011284555Sarybchik */
1012284555Sarybchik#define	EFX_BAR_TBL_DOORBELL_WRITEO(_enp, _reg, _index, _eop)		\
1013284555Sarybchik	do {								\
1014284555Sarybchik		EFX_CHECK_REG((_enp), (_reg));				\
1015284555Sarybchik		EFSYS_PROBE7(efx_bar_tbl_doorbell_writeo,		\
1016284555Sarybchik		    const char *,					\
1017284555Sarybchik		    #_reg,						\
1018284555Sarybchik		    uint32_t, (_index),					\
1019284555Sarybchik		    uint32_t, _reg ## _OFST,				\
1020284555Sarybchik		    uint32_t, (_eop)->eo_u32[3],			\
1021284555Sarybchik		    uint32_t, (_eop)->eo_u32[2],			\
1022284555Sarybchik		    uint32_t, (_eop)->eo_u32[1],			\
1023284555Sarybchik		    uint32_t, (_eop)->eo_u32[0]);			\
1024284555Sarybchik		EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp,		\
1025284555Sarybchik		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
1026284555Sarybchik		    (_eop));						\
1027284555Sarybchik	_NOTE(CONSTANTCONDITION)					\
1028284555Sarybchik	} while (B_FALSE)
1029284555Sarybchik
1030284555Sarybchik#define	EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr)	\
1031284555Sarybchik	do {								\
1032284555Sarybchik		unsigned int _new = (_wptr);				\
1033284555Sarybchik		unsigned int _old = (_owptr);				\
1034284555Sarybchik									\
1035284555Sarybchik		if ((_new) >= (_old))					\
1036284555Sarybchik			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
1037284555Sarybchik			    (_old) * sizeof (efx_desc_t),		\
1038284555Sarybchik			    ((_new) - (_old)) * sizeof (efx_desc_t));	\
1039284555Sarybchik		else							\
1040284555Sarybchik			/*						\
1041284555Sarybchik			 * It is cheaper to sync entire map than sync	\
1042284555Sarybchik			 * two parts especially when offset/size are	\
1043284555Sarybchik			 * ignored and entire map is synced in any case.\
1044284555Sarybchik			 */						\
1045284555Sarybchik			EFSYS_DMA_SYNC_FOR_DEVICE((_esmp),		\
1046284555Sarybchik			    0,						\
1047284555Sarybchik			    (_entries) * sizeof (efx_desc_t));		\
1048284555Sarybchik	_NOTE(CONSTANTCONDITION)					\
1049284555Sarybchik	} while (B_FALSE)
1050284555Sarybchik
1051293927Sarybchikextern	__checkReturn	efx_rc_t
1052227569Sphilipefx_mac_select(
1053227569Sphilip	__in		efx_nic_t *enp);
1054227569Sphilip
1055284555Sarybchikextern	void
1056284555Sarybchikefx_mac_multicast_hash_compute(
1057284555Sarybchik	__in_ecount(6*count)		uint8_t const *addrs,
1058284555Sarybchik	__in				int count,
1059284555Sarybchik	__out				efx_oword_t *hash_low,
1060284555Sarybchik	__out				efx_oword_t *hash_high);
1061284555Sarybchik
1062293927Sarybchikextern	__checkReturn	efx_rc_t
1063227569Sphilipefx_phy_probe(
1064227569Sphilip	__in		efx_nic_t *enp);
1065227569Sphilip
1066227569Sphilipextern			void
1067227569Sphilipefx_phy_unprobe(
1068227569Sphilip	__in		efx_nic_t *enp);
1069227569Sphilip
1070227569Sphilip#if EFSYS_OPT_VPD
1071227569Sphilip
1072227569Sphilip/* VPD utility functions */
1073227569Sphilip
1074293927Sarybchikextern	__checkReturn		efx_rc_t
1075227569Sphilipefx_vpd_hunk_length(
1076227569Sphilip	__in_bcount(size)	caddr_t data,
1077227569Sphilip	__in			size_t size,
1078227569Sphilip	__out			size_t *lengthp);
1079227569Sphilip
1080293927Sarybchikextern	__checkReturn		efx_rc_t
1081227569Sphilipefx_vpd_hunk_verify(
1082227569Sphilip	__in_bcount(size)	caddr_t data,
1083227569Sphilip	__in			size_t size,
1084227569Sphilip	__out_opt		boolean_t *cksummedp);
1085227569Sphilip
1086293927Sarybchikextern	__checkReturn		efx_rc_t
1087227569Sphilipefx_vpd_hunk_reinit(
1088284555Sarybchik	__in_bcount(size)	caddr_t data,
1089227569Sphilip	__in			size_t size,
1090227569Sphilip	__in			boolean_t wantpid);
1091227569Sphilip
1092293927Sarybchikextern	__checkReturn		efx_rc_t
1093227569Sphilipefx_vpd_hunk_get(
1094227569Sphilip	__in_bcount(size)	caddr_t data,
1095227569Sphilip	__in			size_t size,
1096227569Sphilip	__in			efx_vpd_tag_t tag,
1097227569Sphilip	__in			efx_vpd_keyword_t keyword,
1098227569Sphilip	__out			unsigned int *payloadp,
1099227569Sphilip	__out			uint8_t *paylenp);
1100227569Sphilip
1101293927Sarybchikextern	__checkReturn			efx_rc_t
1102227569Sphilipefx_vpd_hunk_next(
1103227569Sphilip	__in_bcount(size)		caddr_t data,
1104227569Sphilip	__in				size_t size,
1105227569Sphilip	__out				efx_vpd_tag_t *tagp,
1106227569Sphilip	__out				efx_vpd_keyword_t *keyword,
1107294017Sarybchik	__out_opt			unsigned int *payloadp,
1108227569Sphilip	__out_opt			uint8_t *paylenp,
1109227569Sphilip	__inout				unsigned int *contp);
1110227569Sphilip
1111293927Sarybchikextern	__checkReturn		efx_rc_t
1112227569Sphilipefx_vpd_hunk_set(
1113227569Sphilip	__in_bcount(size)	caddr_t data,
1114227569Sphilip	__in			size_t size,
1115227569Sphilip	__in			efx_vpd_value_t *evvp);
1116227569Sphilip
1117227569Sphilip#endif	/* EFSYS_OPT_VPD */
1118227569Sphilip
1119284555Sarybchik#if EFSYS_OPT_MCDI
1120284555Sarybchik
1121293927Sarybchikextern	__checkReturn		efx_rc_t
1122284555Sarybchikefx_mcdi_set_workaround(
1123284555Sarybchik	__in			efx_nic_t *enp,
1124284555Sarybchik	__in			uint32_t type,
1125284555Sarybchik	__in			boolean_t enabled,
1126284555Sarybchik	__out_opt		uint32_t *flagsp);
1127284555Sarybchik
1128293927Sarybchikextern	__checkReturn		efx_rc_t
1129284555Sarybchikefx_mcdi_get_workarounds(
1130284555Sarybchik	__in			efx_nic_t *enp,
1131284555Sarybchik	__out_opt		uint32_t *implementedp,
1132284555Sarybchik	__out_opt		uint32_t *enabledp);
1133284555Sarybchik
1134284555Sarybchik#endif /* EFSYS_OPT_MCDI */
1135284555Sarybchik
1136311080Sarybchik#if EFSYS_OPT_MAC_STATS
1137311080Sarybchik
1138311080Sarybchik/*
1139311080Sarybchik * Closed range of stats (i.e. the first and the last are included).
1140311080Sarybchik * The last must be greater or equal (if the range is one item only) to
1141311080Sarybchik * the first.
1142311080Sarybchik */
1143311080Sarybchikstruct efx_mac_stats_range {
1144311080Sarybchik	efx_mac_stat_t		first;
1145311080Sarybchik	efx_mac_stat_t		last;
1146311080Sarybchik};
1147311080Sarybchik
1148311080Sarybchikextern					efx_rc_t
1149311080Sarybchikefx_mac_stats_mask_add_ranges(
1150311080Sarybchik	__inout_bcount(mask_size)	uint32_t *maskp,
1151311080Sarybchik	__in				size_t mask_size,
1152311080Sarybchik	__in_ecount(rng_count)		const struct efx_mac_stats_range *rngp,
1153311080Sarybchik	__in				unsigned int rng_count);
1154311080Sarybchik
1155311080Sarybchik#endif	/* EFSYS_OPT_MAC_STATS */
1156311080Sarybchik
1157227569Sphilip#ifdef	__cplusplus
1158227569Sphilip}
1159227569Sphilip#endif
1160227569Sphilip
1161227569Sphilip#endif	/* _SYS_EFX_IMPL_H */
1162