xref: /freebsd/sys/dev/sfxge/common/efx_impl.h (revision af9078c3f1cf72fb918eaf5d01539e2481c78afc)
1e948693eSPhilip Paeps /*-
2e948693eSPhilip Paeps  * Copyright 2007-2009 Solarflare Communications Inc.  All rights reserved.
3e948693eSPhilip Paeps  *
4e948693eSPhilip Paeps  * Redistribution and use in source and binary forms, with or without
5e948693eSPhilip Paeps  * modification, are permitted provided that the following conditions
6e948693eSPhilip Paeps  * are met:
7e948693eSPhilip Paeps  * 1. Redistributions of source code must retain the above copyright
8e948693eSPhilip Paeps  *    notice, this list of conditions and the following disclaimer.
9e948693eSPhilip Paeps  * 2. Redistributions in binary form must reproduce the above copyright
10e948693eSPhilip Paeps  *    notice, this list of conditions and the following disclaimer in the
11e948693eSPhilip Paeps  *    documentation and/or other materials provided with the distribution.
12e948693eSPhilip Paeps  *
13e948693eSPhilip Paeps  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14e948693eSPhilip Paeps  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15e948693eSPhilip Paeps  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16e948693eSPhilip Paeps  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17e948693eSPhilip Paeps  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18e948693eSPhilip Paeps  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19e948693eSPhilip Paeps  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20e948693eSPhilip Paeps  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21e948693eSPhilip Paeps  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22e948693eSPhilip Paeps  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23e948693eSPhilip Paeps  * SUCH DAMAGE.
245dee87d7SPhilip Paeps  *
255dee87d7SPhilip Paeps  * $FreeBSD$
26e948693eSPhilip Paeps  */
27e948693eSPhilip Paeps 
28e948693eSPhilip Paeps #ifndef	_SYS_EFX_IMPL_H
29e948693eSPhilip Paeps #define	_SYS_EFX_IMPL_H
30e948693eSPhilip Paeps 
31e948693eSPhilip Paeps #include "efsys.h"
32e948693eSPhilip Paeps #include "efx.h"
33e948693eSPhilip Paeps #include "efx_regs.h"
34e948693eSPhilip Paeps 
35e948693eSPhilip Paeps #if EFSYS_OPT_FALCON
36e948693eSPhilip Paeps #include "falcon_impl.h"
37e948693eSPhilip Paeps #endif	/* EFSYS_OPT_FALCON */
38e948693eSPhilip Paeps 
39e948693eSPhilip Paeps #if EFSYS_OPT_SIENA
40e948693eSPhilip Paeps #include "siena_impl.h"
41e948693eSPhilip Paeps #endif	/* EFSYS_OPT_SIENA */
42e948693eSPhilip Paeps 
43e948693eSPhilip Paeps #ifdef	__cplusplus
44e948693eSPhilip Paeps extern "C" {
45e948693eSPhilip Paeps #endif
46e948693eSPhilip Paeps 
47e948693eSPhilip Paeps #define	EFX_MOD_MCDI	0x00000001
48e948693eSPhilip Paeps #define	EFX_MOD_PROBE	0x00000002
49e948693eSPhilip Paeps #define	EFX_MOD_NVRAM	0x00000004
50e948693eSPhilip Paeps #define	EFX_MOD_VPD	0x00000008
51e948693eSPhilip Paeps #define	EFX_MOD_NIC	0x00000010
52e948693eSPhilip Paeps #define	EFX_MOD_INTR	0x00000020
53e948693eSPhilip Paeps #define	EFX_MOD_EV	0x00000040
54e948693eSPhilip Paeps #define	EFX_MOD_RX	0x00000080
55e948693eSPhilip Paeps #define	EFX_MOD_TX	0x00000100
56e948693eSPhilip Paeps #define	EFX_MOD_PORT	0x00000200
57e948693eSPhilip Paeps #define	EFX_MOD_MON	0x00000400
58e948693eSPhilip Paeps #define	EFX_MOD_WOL	0x00000800
59e948693eSPhilip Paeps #define	EFX_MOD_FILTER	0x00001000
60e948693eSPhilip Paeps 
61e948693eSPhilip Paeps #define	EFX_RESET_MAC	0x00000001
62e948693eSPhilip Paeps #define	EFX_RESET_PHY	0x00000002
63e948693eSPhilip Paeps 
64e948693eSPhilip Paeps typedef enum efx_mac_type_e {
65e948693eSPhilip Paeps 	EFX_MAC_INVALID = 0,
66e948693eSPhilip Paeps 	EFX_MAC_FALCON_GMAC,
67e948693eSPhilip Paeps 	EFX_MAC_FALCON_XMAC,
68e948693eSPhilip Paeps 	EFX_MAC_SIENA,
69e948693eSPhilip Paeps 	EFX_MAC_NTYPES
70e948693eSPhilip Paeps } efx_mac_type_t;
71e948693eSPhilip Paeps 
72e948693eSPhilip Paeps typedef struct efx_mac_ops_s {
73e948693eSPhilip Paeps 	int		(*emo_reset)(efx_nic_t *); /* optional */
74e948693eSPhilip Paeps 	int		(*emo_poll)(efx_nic_t *, efx_link_mode_t *);
75e948693eSPhilip Paeps 	int		(*emo_up)(efx_nic_t *, boolean_t *);
76e948693eSPhilip Paeps 	int		(*emo_reconfigure)(efx_nic_t *);
77e948693eSPhilip Paeps #if EFSYS_OPT_LOOPBACK
78e948693eSPhilip Paeps 	int		(*emo_loopback_set)(efx_nic_t *, efx_link_mode_t,
79e948693eSPhilip Paeps 					    efx_loopback_type_t);
80e948693eSPhilip Paeps #endif	/* EFSYS_OPT_LOOPBACK */
81e948693eSPhilip Paeps #if EFSYS_OPT_MAC_STATS
82e948693eSPhilip Paeps 	int		(*emo_stats_upload)(efx_nic_t *, efsys_mem_t *);
83e948693eSPhilip Paeps 	int		(*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *,
84e948693eSPhilip Paeps 					      uint16_t, boolean_t);
85e948693eSPhilip Paeps 	int		(*emo_stats_update)(efx_nic_t *, efsys_mem_t *,
86e948693eSPhilip Paeps 					    efsys_stat_t *, uint32_t *);
87e948693eSPhilip Paeps #endif	/* EFSYS_OPT_MAC_STATS */
88e948693eSPhilip Paeps } efx_mac_ops_t;
89e948693eSPhilip Paeps 
90e948693eSPhilip Paeps typedef struct efx_phy_ops_s {
91e948693eSPhilip Paeps 	int		(*epo_power)(efx_nic_t *, boolean_t); /* optional */
92e948693eSPhilip Paeps 	int		(*epo_reset)(efx_nic_t *);
93e948693eSPhilip Paeps 	int		(*epo_reconfigure)(efx_nic_t *);
94e948693eSPhilip Paeps 	int		(*epo_verify)(efx_nic_t *);
95e948693eSPhilip Paeps 	int		(*epo_uplink_check)(efx_nic_t *,
96e948693eSPhilip Paeps 					    boolean_t *); /* optional */
97e948693eSPhilip Paeps 	int		(*epo_downlink_check)(efx_nic_t *, efx_link_mode_t *,
98e948693eSPhilip Paeps 					      unsigned int *, uint32_t *);
99e948693eSPhilip Paeps 	int		(*epo_oui_get)(efx_nic_t *, uint32_t *);
100e948693eSPhilip Paeps #if EFSYS_OPT_PHY_STATS
101e948693eSPhilip Paeps 	int		(*epo_stats_update)(efx_nic_t *, efsys_mem_t *,
102e948693eSPhilip Paeps 					    uint32_t *);
103e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PHY_STATS */
104e948693eSPhilip Paeps #if EFSYS_OPT_PHY_PROPS
105e948693eSPhilip Paeps #if EFSYS_OPT_NAMES
106e948693eSPhilip Paeps 	const char	__cs *(*epo_prop_name)(efx_nic_t *, unsigned int);
107e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PHY_PROPS */
108e948693eSPhilip Paeps 	int		(*epo_prop_get)(efx_nic_t *, unsigned int, uint32_t,
109e948693eSPhilip Paeps 					uint32_t *);
110e948693eSPhilip Paeps 	int		(*epo_prop_set)(efx_nic_t *, unsigned int, uint32_t);
111e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PHY_PROPS */
112e948693eSPhilip Paeps #if EFSYS_OPT_PHY_BIST
113e948693eSPhilip Paeps 	int		(*epo_bist_start)(efx_nic_t *, efx_phy_bist_type_t);
114e948693eSPhilip Paeps 	int		(*epo_bist_poll)(efx_nic_t *, efx_phy_bist_type_t,
115e948693eSPhilip Paeps 					 efx_phy_bist_result_t *, uint32_t *,
116e948693eSPhilip Paeps 					 unsigned long *, size_t);
117e948693eSPhilip Paeps 	void		(*epo_bist_stop)(efx_nic_t *, efx_phy_bist_type_t);
118e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PHY_BIST */
119e948693eSPhilip Paeps } efx_phy_ops_t;
120e948693eSPhilip Paeps 
121e948693eSPhilip Paeps typedef struct efx_port_s {
122e948693eSPhilip Paeps 	efx_mac_type_t		ep_mac_type;
123e948693eSPhilip Paeps 	uint32_t  		ep_phy_type;
124e948693eSPhilip Paeps 	uint8_t			ep_port;
125e948693eSPhilip Paeps 	uint32_t		ep_mac_pdu;
126e948693eSPhilip Paeps 	uint8_t			ep_mac_addr[6];
127e948693eSPhilip Paeps 	efx_link_mode_t		ep_link_mode;
128e948693eSPhilip Paeps 	boolean_t		ep_unicst;
129e948693eSPhilip Paeps 	boolean_t		ep_brdcst;
130e948693eSPhilip Paeps 	unsigned int		ep_fcntl;
131e948693eSPhilip Paeps 	boolean_t		ep_fcntl_autoneg;
132e948693eSPhilip Paeps 	efx_oword_t		ep_multicst_hash[2];
133e948693eSPhilip Paeps #if EFSYS_OPT_LOOPBACK
134e948693eSPhilip Paeps 	efx_loopback_type_t	ep_loopback_type;
135e948693eSPhilip Paeps 	efx_link_mode_t		ep_loopback_link_mode;
136e948693eSPhilip Paeps #endif	/* EFSYS_OPT_LOOPBACK */
137e948693eSPhilip Paeps #if EFSYS_OPT_PHY_FLAGS
138e948693eSPhilip Paeps 	uint32_t		ep_phy_flags;
139e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PHY_FLAGS */
140e948693eSPhilip Paeps #if EFSYS_OPT_PHY_LED_CONTROL
141e948693eSPhilip Paeps 	efx_phy_led_mode_t	ep_phy_led_mode;
142e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PHY_LED_CONTROL */
143e948693eSPhilip Paeps 	efx_phy_media_type_t	ep_fixed_port_type;
144e948693eSPhilip Paeps 	efx_phy_media_type_t	ep_module_type;
145e948693eSPhilip Paeps 	uint32_t		ep_adv_cap_mask;
146e948693eSPhilip Paeps 	uint32_t		ep_lp_cap_mask;
147e948693eSPhilip Paeps 	uint32_t		ep_default_adv_cap_mask;
148e948693eSPhilip Paeps 	uint32_t		ep_phy_cap_mask;
149e948693eSPhilip Paeps #if EFSYS_OPT_PHY_TXC43128 || EFSYS_OPT_PHY_QT2025C
150e948693eSPhilip Paeps 	union {
151e948693eSPhilip Paeps 		struct {
152e948693eSPhilip Paeps 			unsigned int	bug10934_count;
153e948693eSPhilip Paeps 		} ep_txc43128;
154e948693eSPhilip Paeps 		struct {
155e948693eSPhilip Paeps 			unsigned int	bug17190_count;
156e948693eSPhilip Paeps 		} ep_qt2025c;
157e948693eSPhilip Paeps 	};
158e948693eSPhilip Paeps #endif
159e948693eSPhilip Paeps 	boolean_t		ep_mac_poll_needed; /* falcon only */
160e948693eSPhilip Paeps 	boolean_t		ep_mac_up; /* falcon only */
161e948693eSPhilip Paeps 	uint32_t		ep_fwver; /* falcon only */
162e948693eSPhilip Paeps 	boolean_t		ep_mac_drain;
163e948693eSPhilip Paeps 	boolean_t		ep_mac_stats_pending;
164e948693eSPhilip Paeps #if EFSYS_OPT_PHY_BIST
165e948693eSPhilip Paeps 	efx_phy_bist_type_t	ep_current_bist;
166e948693eSPhilip Paeps #endif
167e948693eSPhilip Paeps 	efx_mac_ops_t		*ep_emop;
168e948693eSPhilip Paeps 	efx_phy_ops_t		*ep_epop;
169e948693eSPhilip Paeps } efx_port_t;
170e948693eSPhilip Paeps 
171e948693eSPhilip Paeps typedef struct efx_mon_ops_s {
172e948693eSPhilip Paeps 	int	(*emo_reset)(efx_nic_t *);
173e948693eSPhilip Paeps 	int	(*emo_reconfigure)(efx_nic_t *);
174e948693eSPhilip Paeps #if EFSYS_OPT_MON_STATS
175e948693eSPhilip Paeps 	int	(*emo_stats_update)(efx_nic_t *, efsys_mem_t *,
176e948693eSPhilip Paeps 				    efx_mon_stat_value_t *);
177e948693eSPhilip Paeps #endif	/* EFSYS_OPT_MON_STATS */
178e948693eSPhilip Paeps } efx_mon_ops_t;
179e948693eSPhilip Paeps 
180e948693eSPhilip Paeps typedef struct efx_mon_s {
181e948693eSPhilip Paeps 	efx_mon_type_t	em_type;
182e948693eSPhilip Paeps 	efx_mon_ops_t	*em_emop;
183e948693eSPhilip Paeps } efx_mon_t;
184e948693eSPhilip Paeps 
185e948693eSPhilip Paeps typedef struct efx_intr_s {
186e948693eSPhilip Paeps 	efx_intr_type_t	ei_type;
187e948693eSPhilip Paeps 	efsys_mem_t	*ei_esmp;
188e948693eSPhilip Paeps 	unsigned int	ei_level;
189e948693eSPhilip Paeps } efx_intr_t;
190e948693eSPhilip Paeps 
191e948693eSPhilip Paeps typedef struct efx_nic_ops_s {
192e948693eSPhilip Paeps 	int	(*eno_probe)(efx_nic_t *);
193e948693eSPhilip Paeps 	int	(*eno_reset)(efx_nic_t *);
194e948693eSPhilip Paeps 	int	(*eno_init)(efx_nic_t *);
195e948693eSPhilip Paeps #if EFSYS_OPT_DIAG
196e948693eSPhilip Paeps 	int	(*eno_sram_test)(efx_nic_t *, efx_sram_pattern_fn_t);
197e948693eSPhilip Paeps 	int	(*eno_register_test)(efx_nic_t *);
198e948693eSPhilip Paeps #endif	/* EFSYS_OPT_DIAG */
199e948693eSPhilip Paeps 	void	(*eno_fini)(efx_nic_t *);
200e948693eSPhilip Paeps 	void	(*eno_unprobe)(efx_nic_t *);
201e948693eSPhilip Paeps } efx_nic_ops_t;
202e948693eSPhilip Paeps 
2039ab060a7SAndrew Rybchenko #ifndef EFX_TXQ_LIMIT_TARGET
204e948693eSPhilip Paeps # define EFX_TXQ_LIMIT_TARGET 259
2059ab060a7SAndrew Rybchenko #endif
2069ab060a7SAndrew Rybchenko #ifndef EFX_RXQ_LIMIT_TARGET
207e948693eSPhilip Paeps # define EFX_RXQ_LIMIT_TARGET 768
2089ab060a7SAndrew Rybchenko #endif
2099ab060a7SAndrew Rybchenko #ifndef EFX_TXQ_DC_SIZE
2109ab060a7SAndrew Rybchenko #define EFX_TXQ_DC_SIZE 1 /* 16 descriptors */
2119ab060a7SAndrew Rybchenko #endif
2129ab060a7SAndrew Rybchenko #ifndef EFX_RXQ_DC_SIZE
2139ab060a7SAndrew Rybchenko #define EFX_RXQ_DC_SIZE 3 /* 64 descriptors */
2149ab060a7SAndrew Rybchenko #endif
215e948693eSPhilip Paeps 
216e948693eSPhilip Paeps #if EFSYS_OPT_FILTER
217e948693eSPhilip Paeps 
218e948693eSPhilip Paeps typedef enum efx_filter_type_e {
219e948693eSPhilip Paeps 	EFX_FILTER_RX_TCP_FULL,	/* TCP/IPv4 4-tuple {dIP,dTCP,sIP,sTCP} */
220e948693eSPhilip Paeps 	EFX_FILTER_RX_TCP_WILD,	/* TCP/IPv4 dest    {dIP,dTCP,  -,   -} */
221e948693eSPhilip Paeps 	EFX_FILTER_RX_UDP_FULL,	/* UDP/IPv4 4-tuple {dIP,dUDP,sIP,sUDP} */
222e948693eSPhilip Paeps 	EFX_FILTER_RX_UDP_WILD,	/* UDP/IPv4 dest    {dIP,dUDP,  -,   -} */
223e948693eSPhilip Paeps 
224e948693eSPhilip Paeps #if EFSYS_OPT_SIENA
225e948693eSPhilip Paeps 	EFX_FILTER_RX_MAC_FULL,	/* Ethernet {dMAC,VLAN} */
226e948693eSPhilip Paeps 	EFX_FILTER_RX_MAC_WILD,	/* Ethernet {dMAC,   -} */
227e948693eSPhilip Paeps 
228e948693eSPhilip Paeps 	EFX_FILTER_TX_TCP_FULL,		/* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */
229e948693eSPhilip Paeps 	EFX_FILTER_TX_TCP_WILD,		/* TCP/IPv4 {  -,   -,sIP,sTCP} */
230e948693eSPhilip Paeps 	EFX_FILTER_TX_UDP_FULL,		/* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */
231e948693eSPhilip Paeps 	EFX_FILTER_TX_UDP_WILD,		/* UDP/IPv4 source (host, port) */
232e948693eSPhilip Paeps 
233e948693eSPhilip Paeps 	EFX_FILTER_TX_MAC_FULL,		/* Ethernet source (MAC address, VLAN ID) */
234e948693eSPhilip Paeps 	EFX_FILTER_TX_MAC_WILD,		/* Ethernet source (MAC address) */
235e948693eSPhilip Paeps #endif /* EFSYS_OPT_SIENA */
236e948693eSPhilip Paeps 
237e948693eSPhilip Paeps 	EFX_FILTER_NTYPES
238e948693eSPhilip Paeps } efx_filter_type_t;
239e948693eSPhilip Paeps 
240e948693eSPhilip Paeps typedef enum efx_filter_tbl_id_e {
241e948693eSPhilip Paeps 	EFX_FILTER_TBL_RX_IP = 0,
242e948693eSPhilip Paeps 	EFX_FILTER_TBL_RX_MAC,
243e948693eSPhilip Paeps 	EFX_FILTER_TBL_TX_IP,
244e948693eSPhilip Paeps 	EFX_FILTER_TBL_TX_MAC,
245e948693eSPhilip Paeps 	EFX_FILTER_NTBLS
246e948693eSPhilip Paeps } efx_filter_tbl_id_t;
247e948693eSPhilip Paeps 
248e948693eSPhilip Paeps typedef struct efx_filter_tbl_s {
249e948693eSPhilip Paeps 	int			eft_size;	/* number of entries */
250e948693eSPhilip Paeps 	int			eft_used;	/* active count */
251e948693eSPhilip Paeps 	uint32_t		*eft_bitmap;	/* active bitmap */
252e948693eSPhilip Paeps 	efx_filter_spec_t	*eft_spec;	/* array of saved specs */
253e948693eSPhilip Paeps } efx_filter_tbl_t;
254e948693eSPhilip Paeps 
255e948693eSPhilip Paeps typedef struct efx_filter_s {
256e948693eSPhilip Paeps 	efx_filter_tbl_t	ef_tbl[EFX_FILTER_NTBLS];
257e948693eSPhilip Paeps 	unsigned int		ef_depth[EFX_FILTER_NTYPES];
258e948693eSPhilip Paeps } efx_filter_t;
259e948693eSPhilip Paeps 
260e948693eSPhilip Paeps 
261e948693eSPhilip Paeps extern	__checkReturn	int
262e948693eSPhilip Paeps efx_filter_insert_filter(
263e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
264e948693eSPhilip Paeps 	__in		efx_filter_spec_t *spec,
265e948693eSPhilip Paeps 	__in		boolean_t replace);
266e948693eSPhilip Paeps 
267e948693eSPhilip Paeps extern	__checkReturn	int
268e948693eSPhilip Paeps efx_filter_remove_filter(
269e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
270e948693eSPhilip Paeps 	__in		efx_filter_spec_t *spec);
271e948693eSPhilip Paeps 
272e948693eSPhilip Paeps extern			void
273e948693eSPhilip Paeps efx_filter_remove_index(
274e948693eSPhilip Paeps 	__inout		efx_nic_t *enp,
275e948693eSPhilip Paeps 	__in		efx_filter_type_t type,
276e948693eSPhilip Paeps 	__in		int filter_idx);
277e948693eSPhilip Paeps 
278e948693eSPhilip Paeps extern			void
279e948693eSPhilip Paeps efx_filter_redirect_index(
280e948693eSPhilip Paeps 	__inout		efx_nic_t *enp,
281e948693eSPhilip Paeps 	__in		efx_filter_type_t type,
282e948693eSPhilip Paeps 	__in		int filter_index,
283e948693eSPhilip Paeps 	__in		int rxq_index);
284e948693eSPhilip Paeps 
285e948693eSPhilip Paeps extern	__checkReturn	int
286e948693eSPhilip Paeps efx_filter_clear_tbl(
287e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
288e948693eSPhilip Paeps 	__in		efx_filter_tbl_id_t tbl);
289e948693eSPhilip Paeps 
290e948693eSPhilip Paeps #endif	/* EFSYS_OPT_FILTER */
291e948693eSPhilip Paeps 
292e948693eSPhilip Paeps #if EFSYS_OPT_NVRAM
293e948693eSPhilip Paeps typedef struct efx_nvram_ops_s {
294e948693eSPhilip Paeps #if EFSYS_OPT_DIAG
295e948693eSPhilip Paeps 	int	(*envo_test)(efx_nic_t *);
296e948693eSPhilip Paeps #endif	/* EFSYS_OPT_DIAG */
297e948693eSPhilip Paeps 	int	(*envo_size)(efx_nic_t *, efx_nvram_type_t, size_t *);
298e948693eSPhilip Paeps 	int	(*envo_get_version)(efx_nic_t *, efx_nvram_type_t,
299e948693eSPhilip Paeps 				    uint32_t *, uint16_t *);
300e948693eSPhilip Paeps 	int	(*envo_rw_start)(efx_nic_t *, efx_nvram_type_t, size_t *);
301e948693eSPhilip Paeps 	int	(*envo_read_chunk)(efx_nic_t *, efx_nvram_type_t,
302e948693eSPhilip Paeps 				    unsigned int, caddr_t, size_t);
303e948693eSPhilip Paeps 	int	(*envo_erase)(efx_nic_t *, efx_nvram_type_t);
304e948693eSPhilip Paeps 	int	(*envo_write_chunk)(efx_nic_t *, efx_nvram_type_t,
305e948693eSPhilip Paeps 				    unsigned int, caddr_t, size_t);
306e948693eSPhilip Paeps 	void	(*envo_rw_finish)(efx_nic_t *, efx_nvram_type_t);
307e948693eSPhilip Paeps 	int	(*envo_set_version)(efx_nic_t *, efx_nvram_type_t, uint16_t *);
308e948693eSPhilip Paeps 
309e948693eSPhilip Paeps } efx_nvram_ops_t;
310e948693eSPhilip Paeps #endif /* EFSYS_OPT_NVRAM */
311e948693eSPhilip Paeps 
312e948693eSPhilip Paeps #if EFSYS_OPT_VPD
313e948693eSPhilip Paeps typedef struct efx_vpd_ops_s {
314e948693eSPhilip Paeps 	int	(*evpdo_init)(efx_nic_t *);
315e948693eSPhilip Paeps 	int	(*evpdo_size)(efx_nic_t *, size_t *);
316e948693eSPhilip Paeps 	int	(*evpdo_read)(efx_nic_t *, caddr_t, size_t);
317e948693eSPhilip Paeps 	int	(*evpdo_verify)(efx_nic_t *, caddr_t, size_t);
318e948693eSPhilip Paeps 	int	(*evpdo_reinit)(efx_nic_t *, caddr_t, size_t);
319e948693eSPhilip Paeps 	int	(*evpdo_get)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *);
320e948693eSPhilip Paeps 	int	(*evpdo_set)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *);
321e948693eSPhilip Paeps 	int	(*evpdo_next)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *,
322e948693eSPhilip Paeps 			    unsigned int *);
323e948693eSPhilip Paeps 	int	(*evpdo_write)(efx_nic_t *, caddr_t, size_t);
324e948693eSPhilip Paeps 	void	(*evpdo_fini)(efx_nic_t *);
325e948693eSPhilip Paeps } efx_vpd_ops_t;
326e948693eSPhilip Paeps #endif	/* EFSYS_OPT_VPD */
327e948693eSPhilip Paeps 
328e948693eSPhilip Paeps struct efx_nic_s {
329e948693eSPhilip Paeps 	uint32_t		en_magic;
330e948693eSPhilip Paeps 	efx_family_t		en_family;
331e948693eSPhilip Paeps 	uint32_t		en_features;
332e948693eSPhilip Paeps 	efsys_identifier_t	*en_esip;
333e948693eSPhilip Paeps 	efsys_lock_t		*en_eslp;
334e948693eSPhilip Paeps 	efsys_bar_t 		*en_esbp;
335e948693eSPhilip Paeps 	unsigned int		en_mod_flags;
336e948693eSPhilip Paeps 	unsigned int		en_reset_flags;
337e948693eSPhilip Paeps 	efx_nic_cfg_t		en_nic_cfg;
338e948693eSPhilip Paeps 	efx_port_t		en_port;
339e948693eSPhilip Paeps 	efx_mon_t		en_mon;
340e948693eSPhilip Paeps 	efx_intr_t		en_intr;
341e948693eSPhilip Paeps 	uint32_t		en_ev_qcount;
342e948693eSPhilip Paeps 	uint32_t		en_rx_qcount;
343e948693eSPhilip Paeps 	uint32_t		en_tx_qcount;
344e948693eSPhilip Paeps 	efx_nic_ops_t		*en_enop;
345e948693eSPhilip Paeps #if EFSYS_OPT_FILTER
346e948693eSPhilip Paeps 	efx_filter_t		en_filter;
347e948693eSPhilip Paeps #endif	/* EFSYS_OPT_FILTER */
348e948693eSPhilip Paeps #if EFSYS_OPT_NVRAM
349e948693eSPhilip Paeps 	efx_nvram_type_t	en_nvram_locked;
350e948693eSPhilip Paeps 	efx_nvram_ops_t		*en_envop;
351e948693eSPhilip Paeps #endif	/* EFSYS_OPT_NVRAM */
352e948693eSPhilip Paeps #if EFSYS_OPT_VPD
353e948693eSPhilip Paeps 	efx_vpd_ops_t		*en_evpdop;
354e948693eSPhilip Paeps #endif	/* EFSYS_OPT_VPD */
355e948693eSPhilip Paeps 	union {
356e948693eSPhilip Paeps #if EFSYS_OPT_FALCON
357e948693eSPhilip Paeps 		struct {
358e948693eSPhilip Paeps 			falcon_spi_dev_t	enu_fsd[FALCON_SPI_NTYPES];
359e948693eSPhilip Paeps 			falcon_i2c_t		enu_fip;
360e948693eSPhilip Paeps 			boolean_t		enu_i2c_locked;
361e948693eSPhilip Paeps #if EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE
362e948693eSPhilip Paeps 			const uint8_t		*enu_forced_cfg;
363e948693eSPhilip Paeps #endif	/* EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE */
364e948693eSPhilip Paeps 			uint8_t			enu_mon_devid;
365e948693eSPhilip Paeps #if EFSYS_OPT_PCIE_TUNE
366e948693eSPhilip Paeps 			unsigned int 		enu_nlanes;
367e948693eSPhilip Paeps #endif	/* EFSYS_OPT_PCIE_TUNE */
368e948693eSPhilip Paeps 			uint16_t		enu_board_rev;
369e948693eSPhilip Paeps 			boolean_t		enu_internal_sram;
370e948693eSPhilip Paeps 			uint8_t			enu_sram_num_bank;
371e948693eSPhilip Paeps 			uint8_t			enu_sram_bank_size;
372e948693eSPhilip Paeps 		} falcon;
373e948693eSPhilip Paeps #endif	/* EFSYS_OPT_FALCON */
374e948693eSPhilip Paeps #if EFSYS_OPT_SIENA
375e948693eSPhilip Paeps 		struct {
376e948693eSPhilip Paeps #if EFSYS_OPT_MCDI
377e948693eSPhilip Paeps 			efx_mcdi_iface_t	enu_mip;
378e948693eSPhilip Paeps #endif	/* EFSYS_OPT_MCDI */
379e948693eSPhilip Paeps #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
380e948693eSPhilip Paeps 			unsigned int		enu_partn_mask;
381e948693eSPhilip Paeps #endif	/* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
382e948693eSPhilip Paeps #if EFSYS_OPT_VPD
383e948693eSPhilip Paeps 			caddr_t			enu_svpd;
384e948693eSPhilip Paeps 			size_t			enu_svpd_length;
385e948693eSPhilip Paeps #endif	/* EFSYS_OPT_VPD */
386e948693eSPhilip Paeps 		} siena;
387e948693eSPhilip Paeps #endif	/* EFSYS_OPT_SIENA */
388e948693eSPhilip Paeps 	} en_u;
389e948693eSPhilip Paeps };
390e948693eSPhilip Paeps 
391e948693eSPhilip Paeps 
392e948693eSPhilip Paeps #define	EFX_NIC_MAGIC	0x02121996
393e948693eSPhilip Paeps 
394e948693eSPhilip Paeps typedef	boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *,
395e948693eSPhilip Paeps     const efx_ev_callbacks_t *, void *);
396e948693eSPhilip Paeps 
397e948693eSPhilip Paeps struct efx_evq_s {
398e948693eSPhilip Paeps 	uint32_t			ee_magic;
399e948693eSPhilip Paeps 	efx_nic_t			*ee_enp;
400e948693eSPhilip Paeps 	unsigned int			ee_index;
401e948693eSPhilip Paeps 	unsigned int			ee_mask;
402e948693eSPhilip Paeps 	efsys_mem_t			*ee_esmp;
403e948693eSPhilip Paeps #if EFSYS_OPT_QSTATS
404e948693eSPhilip Paeps 	uint32_t			ee_stat[EV_NQSTATS];
405e948693eSPhilip Paeps #endif	/* EFSYS_OPT_QSTATS */
406e948693eSPhilip Paeps 	efx_ev_handler_t		ee_handler[1 << FSF_AZ_EV_CODE_WIDTH];
407e948693eSPhilip Paeps };
408e948693eSPhilip Paeps 
409e948693eSPhilip Paeps #define	EFX_EVQ_MAGIC	0x08081997
410e948693eSPhilip Paeps 
411*af9078c3SAndrew Rybchenko #define	EFX_EVQ_FALCON_TIMER_QUANTUM_NS	4968 /* 621 cycles */
412*af9078c3SAndrew Rybchenko #define	EFX_EVQ_SIENA_TIMER_QUANTUM_NS	6144 /* 768 cycles */
413e948693eSPhilip Paeps 
414e948693eSPhilip Paeps struct efx_rxq_s {
415e948693eSPhilip Paeps 	uint32_t			er_magic;
416e948693eSPhilip Paeps 	efx_nic_t			*er_enp;
417e948693eSPhilip Paeps 	unsigned int			er_index;
418e948693eSPhilip Paeps 	unsigned int			er_mask;
419e948693eSPhilip Paeps 	efsys_mem_t			*er_esmp;
420e948693eSPhilip Paeps };
421e948693eSPhilip Paeps 
422e948693eSPhilip Paeps #define	EFX_RXQ_MAGIC	0x15022005
423e948693eSPhilip Paeps 
424e948693eSPhilip Paeps struct efx_txq_s {
425e948693eSPhilip Paeps 	uint32_t			et_magic;
426e948693eSPhilip Paeps 	efx_nic_t			*et_enp;
427e948693eSPhilip Paeps 	unsigned int			et_index;
428e948693eSPhilip Paeps 	unsigned int			et_mask;
429e948693eSPhilip Paeps 	efsys_mem_t			*et_esmp;
430e948693eSPhilip Paeps #if EFSYS_OPT_QSTATS
431e948693eSPhilip Paeps 	uint32_t			et_stat[TX_NQSTATS];
432e948693eSPhilip Paeps #endif	/* EFSYS_OPT_QSTATS */
433e948693eSPhilip Paeps };
434e948693eSPhilip Paeps 
435e948693eSPhilip Paeps #define	EFX_TXQ_MAGIC	0x05092005
436e948693eSPhilip Paeps 
437e948693eSPhilip Paeps #define	EFX_MAC_ADDR_COPY(_dst, _src)					\
438e948693eSPhilip Paeps 	do {								\
439e948693eSPhilip Paeps 		(_dst)[0] = (_src)[0];					\
440e948693eSPhilip Paeps 		(_dst)[1] = (_src)[1];					\
441e948693eSPhilip Paeps 		(_dst)[2] = (_src)[2];					\
442e948693eSPhilip Paeps 		(_dst)[3] = (_src)[3];					\
443e948693eSPhilip Paeps 		(_dst)[4] = (_src)[4];					\
444e948693eSPhilip Paeps 		(_dst)[5] = (_src)[5];					\
445e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
446e948693eSPhilip Paeps 	} while (B_FALSE)
447e948693eSPhilip Paeps 
448e948693eSPhilip Paeps #if EFSYS_OPT_CHECK_REG
449e948693eSPhilip Paeps #define	EFX_CHECK_REG(_enp, _reg)					\
450e948693eSPhilip Paeps 	do {								\
451e948693eSPhilip Paeps 		const char __cs *name = #_reg;				\
452e948693eSPhilip Paeps 		char min = name[4];					\
453e948693eSPhilip Paeps 		char max = name[5];					\
454e948693eSPhilip Paeps 		char rev;						\
455e948693eSPhilip Paeps 									\
456e948693eSPhilip Paeps 		switch ((_enp)->en_family) {				\
457e948693eSPhilip Paeps 		case EFX_FAMILY_FALCON:					\
458e948693eSPhilip Paeps 			rev = 'B';					\
459e948693eSPhilip Paeps 			break;						\
460e948693eSPhilip Paeps 									\
461e948693eSPhilip Paeps 		case EFX_FAMILY_SIENA:					\
462e948693eSPhilip Paeps 			rev = 'C';					\
463e948693eSPhilip Paeps 			break;						\
464e948693eSPhilip Paeps 									\
465e948693eSPhilip Paeps 		default:						\
466e948693eSPhilip Paeps 			rev = '?';					\
467e948693eSPhilip Paeps 			break;						\
468e948693eSPhilip Paeps 		}							\
469e948693eSPhilip Paeps 									\
470e948693eSPhilip Paeps 		EFSYS_ASSERT3S(rev, >=, min);				\
471e948693eSPhilip Paeps 		EFSYS_ASSERT3S(rev, <=, max);				\
472e948693eSPhilip Paeps 									\
473e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
474e948693eSPhilip Paeps 	} while (B_FALSE)
475e948693eSPhilip Paeps #else
476e948693eSPhilip Paeps #define	EFX_CHECK_REG(_enp, _reg) do {					\
477e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
478e948693eSPhilip Paeps 	} while(B_FALSE)
479e948693eSPhilip Paeps #endif
480e948693eSPhilip Paeps 
481e948693eSPhilip Paeps #define	EFX_BAR_READD(_enp, _reg, _edp, _lock)				\
482e948693eSPhilip Paeps 	do {								\
483e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
484e948693eSPhilip Paeps 		EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST,		\
485e948693eSPhilip Paeps 		    (_edp), (_lock));					\
486e948693eSPhilip Paeps 		EFSYS_PROBE3(efx_bar_readd, const char *, #_reg,	\
487e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
488e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
489e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
490e948693eSPhilip Paeps 	} while (B_FALSE)
491e948693eSPhilip Paeps 
492e948693eSPhilip Paeps #define	EFX_BAR_WRITED(_enp, _reg, _edp, _lock)				\
493e948693eSPhilip Paeps 	do {								\
494e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
495e948693eSPhilip Paeps 		EFSYS_PROBE3(efx_bar_writed, const char *, #_reg,	\
496e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
497e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
498e948693eSPhilip Paeps 		EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST,	\
499e948693eSPhilip Paeps 		    (_edp), (_lock));					\
500e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
501e948693eSPhilip Paeps 	} while (B_FALSE)
502e948693eSPhilip Paeps 
503e948693eSPhilip Paeps #define	EFX_BAR_READQ(_enp, _reg, _eqp)					\
504e948693eSPhilip Paeps 	do {								\
505e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
506e948693eSPhilip Paeps 		EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST,		\
507e948693eSPhilip Paeps 		    (_eqp));						\
508e948693eSPhilip Paeps 		EFSYS_PROBE4(efx_bar_readq, const char *, #_reg,	\
509e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
510e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
511e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
512e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
513e948693eSPhilip Paeps 	} while (B_FALSE)
514e948693eSPhilip Paeps 
515e948693eSPhilip Paeps #define	EFX_BAR_WRITEQ(_enp, _reg, _eqp)				\
516e948693eSPhilip Paeps 	do {								\
517e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
518e948693eSPhilip Paeps 		EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg,	\
519e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
520e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
521e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
522e948693eSPhilip Paeps 		EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST,	\
523e948693eSPhilip Paeps 		    (_eqp));						\
524e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
525e948693eSPhilip Paeps 	} while (B_FALSE)
526e948693eSPhilip Paeps 
527e948693eSPhilip Paeps #define	EFX_BAR_READO(_enp, _reg, _eop)					\
528e948693eSPhilip Paeps 	do {								\
529e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
530e948693eSPhilip Paeps 		EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST,		\
531e948693eSPhilip Paeps 		    (_eop), B_TRUE);					\
532e948693eSPhilip Paeps 		EFSYS_PROBE6(efx_bar_reado, const char *, #_reg,	\
533e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
534e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
535e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
536e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
537e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
538e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
539e948693eSPhilip Paeps 	} while (B_FALSE)
540e948693eSPhilip Paeps 
541e948693eSPhilip Paeps #define	EFX_BAR_WRITEO(_enp, _reg, _eop)				\
542e948693eSPhilip Paeps 	do {								\
543e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
544e948693eSPhilip Paeps 		EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg,	\
545e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
546e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
547e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
548e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
549e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
550e948693eSPhilip Paeps 		EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST,	\
551e948693eSPhilip Paeps 		    (_eop), B_TRUE);					\
552e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
553e948693eSPhilip Paeps 	} while (B_FALSE)
554e948693eSPhilip Paeps 
555e948693eSPhilip Paeps #define	EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock)		\
556e948693eSPhilip Paeps 	do {								\
557e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
558e948693eSPhilip Paeps 		EFSYS_BAR_READD((_enp)->en_esbp,			\
559e948693eSPhilip Paeps 		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
560e948693eSPhilip Paeps 		    (_edp), (_lock));					\
561e948693eSPhilip Paeps 		EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg,	\
562e948693eSPhilip Paeps 		    uint32_t, (_index),					\
563e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
564e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
565e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
566e948693eSPhilip Paeps 	} while (B_FALSE)
567e948693eSPhilip Paeps 
568e948693eSPhilip Paeps #define	EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock)		\
569e948693eSPhilip Paeps 	do {								\
570e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
571e948693eSPhilip Paeps 		EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg,	\
572e948693eSPhilip Paeps 		    uint32_t, (_index),					\
573e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
574e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
575e948693eSPhilip Paeps 		EFSYS_BAR_WRITED((_enp)->en_esbp,			\
576e948693eSPhilip Paeps 		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
577e948693eSPhilip Paeps 		    (_edp), (_lock));					\
578e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
579e948693eSPhilip Paeps 	} while (B_FALSE)
580e948693eSPhilip Paeps 
581e948693eSPhilip Paeps #define	EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock)		\
582e948693eSPhilip Paeps 	do {								\
583e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
584e948693eSPhilip Paeps 		EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg,	\
585e948693eSPhilip Paeps 		    uint32_t, (_index),					\
586e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
587e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
588e948693eSPhilip Paeps 		EFSYS_BAR_WRITED((_enp)->en_esbp,			\
589e948693eSPhilip Paeps 		    (_reg ## _OFST +					\
590e948693eSPhilip Paeps 		    (3 * sizeof (efx_dword_t)) + 			\
591e948693eSPhilip Paeps 		    ((_index) * _reg ## _STEP)),			\
592e948693eSPhilip Paeps 		    (_edp), (_lock));					\
593e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
594e948693eSPhilip Paeps 	} while (B_FALSE)
595e948693eSPhilip Paeps 
596e948693eSPhilip Paeps #define	EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp)			\
597e948693eSPhilip Paeps 	do {								\
598e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
599e948693eSPhilip Paeps 		EFSYS_BAR_READQ((_enp)->en_esbp,			\
600e948693eSPhilip Paeps 		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
601e948693eSPhilip Paeps 		    (_eqp));						\
602e948693eSPhilip Paeps 		EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg,	\
603e948693eSPhilip Paeps 		    uint32_t, (_index),					\
604e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
605e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
606e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
607e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
608e948693eSPhilip Paeps 	} while (B_FALSE)
609e948693eSPhilip Paeps 
610e948693eSPhilip Paeps #define	EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp)			\
611e948693eSPhilip Paeps 	do {								\
612e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
613e948693eSPhilip Paeps 		EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg,	\
614e948693eSPhilip Paeps 		    uint32_t, (_index),					\
615e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
616e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
617e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
618e948693eSPhilip Paeps 		EFSYS_BAR_WRITEQ((_enp)->en_esbp,			\
619e948693eSPhilip Paeps 		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
620e948693eSPhilip Paeps 		    (_eqp));						\
621e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
622e948693eSPhilip Paeps 	} while (B_FALSE)
623e948693eSPhilip Paeps 
624e948693eSPhilip Paeps #define	EFX_BAR_TBL_READO(_enp, _reg, _index, _eop)			\
625e948693eSPhilip Paeps 	do {								\
626e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
627e948693eSPhilip Paeps 		EFSYS_BAR_READO((_enp)->en_esbp,			\
628e948693eSPhilip Paeps 		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
629e948693eSPhilip Paeps 		    (_eop), B_TRUE);					\
630e948693eSPhilip Paeps 		EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg,	\
631e948693eSPhilip Paeps 		    uint32_t, (_index),					\
632e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
633e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
634e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
635e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
636e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
637e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
638e948693eSPhilip Paeps 	} while (B_FALSE)
639e948693eSPhilip Paeps 
640e948693eSPhilip Paeps #define	EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop)			\
641e948693eSPhilip Paeps 	do {								\
642e948693eSPhilip Paeps 		EFX_CHECK_REG((_enp), (_reg));				\
643e948693eSPhilip Paeps 		EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg,	\
644e948693eSPhilip Paeps 		    uint32_t, (_index),					\
645e948693eSPhilip Paeps 		    uint32_t, _reg ## _OFST,				\
646e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
647e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
648e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
649e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
650e948693eSPhilip Paeps 		EFSYS_BAR_WRITEO((_enp)->en_esbp,			\
651e948693eSPhilip Paeps 		    (_reg ## _OFST + ((_index) * _reg ## _STEP)),	\
652e948693eSPhilip Paeps 		    (_eop), B_TRUE);					\
653e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
654e948693eSPhilip Paeps 	} while (B_FALSE)
655e948693eSPhilip Paeps 
656e948693eSPhilip Paeps extern	__checkReturn	int
657e948693eSPhilip Paeps efx_mac_select(
658e948693eSPhilip Paeps 	__in		efx_nic_t *enp);
659e948693eSPhilip Paeps 
660e948693eSPhilip Paeps extern	__checkReturn	int
661e948693eSPhilip Paeps efx_phy_probe(
662e948693eSPhilip Paeps 	__in		efx_nic_t *enp);
663e948693eSPhilip Paeps 
664e948693eSPhilip Paeps extern			void
665e948693eSPhilip Paeps efx_phy_unprobe(
666e948693eSPhilip Paeps 	__in		efx_nic_t *enp);
667e948693eSPhilip Paeps 
668e948693eSPhilip Paeps #if EFSYS_OPT_VPD
669e948693eSPhilip Paeps 
670e948693eSPhilip Paeps /* VPD utility functions */
671e948693eSPhilip Paeps 
672e948693eSPhilip Paeps extern	__checkReturn		int
673e948693eSPhilip Paeps efx_vpd_hunk_length(
674e948693eSPhilip Paeps 	__in_bcount(size)	caddr_t data,
675e948693eSPhilip Paeps 	__in			size_t size,
676e948693eSPhilip Paeps 	__out			size_t *lengthp);
677e948693eSPhilip Paeps 
678e948693eSPhilip Paeps extern	__checkReturn		int
679e948693eSPhilip Paeps efx_vpd_hunk_verify(
680e948693eSPhilip Paeps 	__in_bcount(size)	caddr_t data,
681e948693eSPhilip Paeps 	__in			size_t size,
682e948693eSPhilip Paeps 	__out_opt		boolean_t *cksummedp);
683e948693eSPhilip Paeps 
684e948693eSPhilip Paeps extern	__checkReturn		int
685e948693eSPhilip Paeps efx_vpd_hunk_reinit(
686e948693eSPhilip Paeps 	__in			caddr_t data,
687e948693eSPhilip Paeps 	__in			size_t size,
688e948693eSPhilip Paeps 	__in			boolean_t wantpid);
689e948693eSPhilip Paeps 
690e948693eSPhilip Paeps extern	__checkReturn		int
691e948693eSPhilip Paeps efx_vpd_hunk_get(
692e948693eSPhilip Paeps 	__in_bcount(size)	caddr_t data,
693e948693eSPhilip Paeps 	__in			size_t size,
694e948693eSPhilip Paeps 	__in			efx_vpd_tag_t tag,
695e948693eSPhilip Paeps 	__in			efx_vpd_keyword_t keyword,
696e948693eSPhilip Paeps 	__out			unsigned int *payloadp,
697e948693eSPhilip Paeps 	__out			uint8_t *paylenp);
698e948693eSPhilip Paeps 
699e948693eSPhilip Paeps extern	__checkReturn			int
700e948693eSPhilip Paeps efx_vpd_hunk_next(
701e948693eSPhilip Paeps 	__in_bcount(size)		caddr_t data,
702e948693eSPhilip Paeps 	__in				size_t size,
703e948693eSPhilip Paeps 	__out				efx_vpd_tag_t *tagp,
704e948693eSPhilip Paeps 	__out				efx_vpd_keyword_t *keyword,
705e948693eSPhilip Paeps 	__out_bcount_opt(*paylenp)	unsigned int *payloadp,
706e948693eSPhilip Paeps 	__out_opt			uint8_t *paylenp,
707e948693eSPhilip Paeps 	__inout				unsigned int *contp);
708e948693eSPhilip Paeps 
709e948693eSPhilip Paeps extern	__checkReturn		int
710e948693eSPhilip Paeps efx_vpd_hunk_set(
711e948693eSPhilip Paeps 	__in_bcount(size)	caddr_t data,
712e948693eSPhilip Paeps 	__in			size_t size,
713e948693eSPhilip Paeps 	__in			efx_vpd_value_t *evvp);
714e948693eSPhilip Paeps 
715e948693eSPhilip Paeps #endif	/* EFSYS_OPT_VPD */
716e948693eSPhilip Paeps 
717e948693eSPhilip Paeps #if EFSYS_OPT_DIAG
718e948693eSPhilip Paeps 
719e948693eSPhilip Paeps extern	efx_sram_pattern_fn_t	__cs __efx_sram_pattern_fns[];
720e948693eSPhilip Paeps 
721e948693eSPhilip Paeps typedef struct efx_register_set_s {
722e948693eSPhilip Paeps 	unsigned int		address;
723e948693eSPhilip Paeps 	unsigned int		step;
724e948693eSPhilip Paeps 	unsigned int		rows;
725e948693eSPhilip Paeps 	efx_oword_t		mask;
726e948693eSPhilip Paeps } efx_register_set_t;
727e948693eSPhilip Paeps 
728e948693eSPhilip Paeps extern	__checkReturn	int
729e948693eSPhilip Paeps efx_nic_test_registers(
730e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
731e948693eSPhilip Paeps 	__in		efx_register_set_t *rsp,
732e948693eSPhilip Paeps 	__in		size_t count);
733e948693eSPhilip Paeps 
734e948693eSPhilip Paeps extern	__checkReturn	int
735e948693eSPhilip Paeps efx_nic_test_tables(
736e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
737e948693eSPhilip Paeps 	__in		efx_register_set_t *rsp,
738e948693eSPhilip Paeps 	__in		efx_pattern_type_t pattern,
739e948693eSPhilip Paeps 	__in		size_t count);
740e948693eSPhilip Paeps 
741e948693eSPhilip Paeps #endif	/* EFSYS_OPT_DIAG */
742e948693eSPhilip Paeps 
743e948693eSPhilip Paeps #ifdef	__cplusplus
744e948693eSPhilip Paeps }
745e948693eSPhilip Paeps #endif
746e948693eSPhilip Paeps 
747e948693eSPhilip Paeps #endif	/* _SYS_EFX_IMPL_H */
748