1227569Sphilip/*-
2300607Sarybchik * Copyright (c) 2010-2016 Solarflare Communications Inc.
3227569Sphilip * All rights reserved.
4227569Sphilip *
5227569Sphilip * This software was developed in part by Philip Paeps under contract for
6227569Sphilip * Solarflare Communications, Inc.
7227569Sphilip *
8227569Sphilip * Redistribution and use in source and binary forms, with or without
9283514Sarybchik * modification, are permitted provided that the following conditions are met:
10227569Sphilip *
11283514Sarybchik * 1. Redistributions of source code must retain the above copyright notice,
12283514Sarybchik *    this list of conditions and the following disclaimer.
13283514Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice,
14283514Sarybchik *    this list of conditions and the following disclaimer in the documentation
15283514Sarybchik *    and/or other materials provided with the distribution.
16227569Sphilip *
17283514Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18283514Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19283514Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20283514Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21283514Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22283514Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23283514Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24283514Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25283514Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26283514Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27283514Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28283514Sarybchik *
29283514Sarybchik * The views and conclusions contained in the software and documentation are
30283514Sarybchik * those of the authors and should not be interpreted as representing official
31283514Sarybchik * policies, either expressed or implied, of the FreeBSD Project.
32283514Sarybchik *
33227569Sphilip * $FreeBSD: stable/11/sys/dev/sfxge/sfxge.h 342455 2018-12-25 07:39:34Z arybchik $
34227569Sphilip */
35227569Sphilip
36227569Sphilip#ifndef _SFXGE_H
37272325Sgnn#define	_SFXGE_H
38227569Sphilip
39227569Sphilip#include <sys/param.h>
40227569Sphilip#include <sys/kernel.h>
41227569Sphilip#include <sys/socket.h>
42227569Sphilip#include <sys/sysctl.h>
43227569Sphilip#include <sys/sx.h>
44227569Sphilip#include <vm/uma.h>
45227569Sphilip
46227569Sphilip#include <net/ethernet.h>
47227569Sphilip#include <net/if.h>
48257176Sglebius#include <net/if_var.h>
49227569Sphilip#include <net/if_media.h>
50227569Sphilip#include <net/if_types.h>
51227569Sphilip
52283514Sarybchik#include "sfxge_ioc.h"
53283514Sarybchik
54227569Sphilip/*
55283514Sarybchik * Debugging
56283514Sarybchik */
57283514Sarybchik#if 0
58283514Sarybchik#define	DBGPRINT(dev, fmt, args...) \
59283514Sarybchik	device_printf(dev, "%s: " fmt "\n", __func__, ## args)
60283514Sarybchik#else
61283514Sarybchik#define	DBGPRINT(dev, fmt, args...)
62283514Sarybchik#endif
63283514Sarybchik
64283514Sarybchik/*
65227569Sphilip * Backward-compatibility
66227569Sphilip */
67227569Sphilip#ifndef CACHE_LINE_SIZE
68227569Sphilip/* This should be right on most machines the driver will be used on, and
69227569Sphilip * we needn't care too much about wasting a few KB per interface.
70227569Sphilip */
71272325Sgnn#define	CACHE_LINE_SIZE 128
72227569Sphilip#endif
73280432Sarybchik
74227569Sphilip#ifndef IFCAP_LINKSTATE
75272325Sgnn#define	IFCAP_LINKSTATE 0
76227569Sphilip#endif
77280432Sarybchik
78227569Sphilip#ifndef IFCAP_VLAN_HWTSO
79272325Sgnn#define	IFCAP_VLAN_HWTSO 0
80227569Sphilip#endif
81280432Sarybchik
82227569Sphilip#ifndef IFM_10G_T
83272325Sgnn#define	IFM_10G_T IFM_UNKNOWN
84227569Sphilip#endif
85280432Sarybchik
86227569Sphilip#ifndef IFM_10G_KX4
87272325Sgnn#define	IFM_10G_KX4 IFM_10G_CX4
88227569Sphilip#endif
89280432Sarybchik
90283514Sarybchik#ifndef IFM_40G_CR4
91283514Sarybchik#define	IFM_40G_CR4 IFM_UNKNOWN
92283514Sarybchik#endif
93283514Sarybchik
94227569Sphilip#if (__FreeBSD_version >= 800501 && __FreeBSD_version < 900000) || \
95227569Sphilip	__FreeBSD_version >= 900003
96272325Sgnn#define	SFXGE_HAVE_DESCRIBE_INTR
97227569Sphilip#endif
98280432Sarybchik
99227569Sphilip#ifdef IFM_ETH_RXPAUSE
100272325Sgnn#define	SFXGE_HAVE_PAUSE_MEDIAOPTS
101227569Sphilip#endif
102280432Sarybchik
103227569Sphilip#ifndef CTLTYPE_U64
104272325Sgnn#define	CTLTYPE_U64 CTLTYPE_QUAD
105227569Sphilip#endif
106227569Sphilip
107227569Sphilip#include "sfxge_rx.h"
108227569Sphilip#include "sfxge_tx.h"
109227569Sphilip
110272328Sgnn#define	ROUNDUP_POW_OF_TWO(_n)	(1ULL << flsl((_n) - 1))
111272328Sgnn
112272325Sgnn#define	SFXGE_IP_ALIGN	2
113227569Sphilip
114272325Sgnn#define	SFXGE_ETHERTYPE_LOOPBACK	0x9000	/* Xerox loopback */
115227569Sphilip
116301067Sarybchik
117301067Sarybchik#define	SFXGE_MAGIC_RESERVED		0x8000
118301067Sarybchik
119301067Sarybchik#define	SFXGE_MAGIC_DMAQ_LABEL_WIDTH	6
120301067Sarybchik#define	SFXGE_MAGIC_DMAQ_LABEL_MASK \
121301067Sarybchik	((1 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH) - 1)
122301067Sarybchik
123301075Sarybchikenum sfxge_sw_ev {
124301075Sarybchik	SFXGE_SW_EV_RX_QFLUSH_DONE = 1,
125301075Sarybchik	SFXGE_SW_EV_RX_QFLUSH_FAILED,
126301075Sarybchik	SFXGE_SW_EV_RX_QREFILL,
127301075Sarybchik	SFXGE_SW_EV_TX_QFLUSH_DONE,
128301075Sarybchik};
129301067Sarybchik
130301075Sarybchik#define	SFXGE_SW_EV_MAGIC(_sw_ev) \
131301075Sarybchik	(SFXGE_MAGIC_RESERVED | ((_sw_ev) << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
132301067Sarybchik
133301105Sarybchikstatic inline uint16_t
134301105Sarybchiksfxge_sw_ev_mk_magic(enum sfxge_sw_ev sw_ev, unsigned int label)
135301105Sarybchik{
136301105Sarybchik	KASSERT((label & SFXGE_MAGIC_DMAQ_LABEL_MASK) == label,
137301105Sarybchik	    ("(label & SFXGE_MAGIC_DMAQ_LABEL_MASK) != label"));
138301105Sarybchik	return SFXGE_SW_EV_MAGIC(sw_ev) | label;
139301105Sarybchik}
140301105Sarybchik
141301105Sarybchikstatic inline uint16_t
142301105Sarybchiksfxge_sw_ev_rxq_magic(enum sfxge_sw_ev sw_ev, struct sfxge_rxq *rxq)
143301105Sarybchik{
144301105Sarybchik	return sfxge_sw_ev_mk_magic(sw_ev, 0);
145301105Sarybchik}
146301105Sarybchik
147301105Sarybchikstatic inline uint16_t
148301105Sarybchiksfxge_sw_ev_txq_magic(enum sfxge_sw_ev sw_ev, struct sfxge_txq *txq)
149301105Sarybchik{
150301105Sarybchik	return sfxge_sw_ev_mk_magic(sw_ev, txq->type);
151301105Sarybchik}
152301105Sarybchik
153227569Sphilipenum sfxge_evq_state {
154227569Sphilip	SFXGE_EVQ_UNINITIALIZED = 0,
155227569Sphilip	SFXGE_EVQ_INITIALIZED,
156227569Sphilip	SFXGE_EVQ_STARTING,
157227569Sphilip	SFXGE_EVQ_STARTED
158227569Sphilip};
159227569Sphilip
160227569Sphilip#define	SFXGE_EV_BATCH	16384
161227569Sphilip
162312159Sarybchik#define	SFXGE_STATS_UPDATE_PERIOD_MS	1000
163312159Sarybchik
164227569Sphilipstruct sfxge_evq {
165277887Sarybchik	/* Structure members below are sorted by usage order */
166277887Sarybchik	struct sfxge_softc	*sc;
167277887Sarybchik	struct mtx		lock;
168277887Sarybchik	unsigned int		index;
169227569Sphilip	enum sfxge_evq_state	init_state;
170227569Sphilip	efsys_mem_t		mem;
171227569Sphilip	efx_evq_t		*common;
172227569Sphilip	unsigned int		read_ptr;
173277887Sarybchik	boolean_t		exception;
174227569Sphilip	unsigned int		rx_done;
175227569Sphilip	unsigned int		tx_done;
176227569Sphilip
177227569Sphilip	/* Linked list of TX queues with completions to process */
178227569Sphilip	struct sfxge_txq	*txq;
179227569Sphilip	struct sfxge_txq	**txqs;
180227569Sphilip
181277887Sarybchik	/* Structure members not used on event processing path */
182277887Sarybchik	unsigned int		buf_base_id;
183277887Sarybchik	unsigned int		entries;
184278250Sarybchik	char			lock_name[SFXGE_LOCK_NAME_MAX];
185342452Sarybchik#if EFSYS_OPT_QSTATS
186342452Sarybchik	clock_t			stats_update_time;
187342452Sarybchik	uint64_t		stats[EV_NQSTATS];
188342452Sarybchik#endif
189277887Sarybchik} __aligned(CACHE_LINE_SIZE);
190277887Sarybchik
191227569Sphilip#define	SFXGE_NDESCS	1024
192227569Sphilip#define	SFXGE_MODERATION	30
193227569Sphilip
194227569Sphilipenum sfxge_intr_state {
195227569Sphilip	SFXGE_INTR_UNINITIALIZED = 0,
196227569Sphilip	SFXGE_INTR_INITIALIZED,
197227569Sphilip	SFXGE_INTR_TESTING,
198227569Sphilip	SFXGE_INTR_STARTED
199227569Sphilip};
200227569Sphilip
201227569Sphilipstruct sfxge_intr_hdl {
202272325Sgnn	int			eih_rid;
203272325Sgnn	void			*eih_tag;
204272325Sgnn	struct resource		*eih_res;
205227569Sphilip};
206227569Sphilip
207227569Sphilipstruct sfxge_intr {
208227569Sphilip	enum sfxge_intr_state	state;
209227569Sphilip	struct resource		*msix_res;
210227569Sphilip	struct sfxge_intr_hdl	*table;
211227569Sphilip	int			n_alloc;
212227569Sphilip	int			type;
213227569Sphilip	efsys_mem_t		status;
214227569Sphilip	uint32_t		zero_count;
215227569Sphilip};
216227569Sphilip
217227569Sphilipenum sfxge_mcdi_state {
218227569Sphilip	SFXGE_MCDI_UNINITIALIZED = 0,
219227569Sphilip	SFXGE_MCDI_INITIALIZED,
220227569Sphilip	SFXGE_MCDI_BUSY,
221227569Sphilip	SFXGE_MCDI_COMPLETED
222227569Sphilip};
223227569Sphilip
224227569Sphilipstruct sfxge_mcdi {
225227569Sphilip	struct mtx		lock;
226283514Sarybchik	efsys_mem_t		mem;
227227569Sphilip	enum sfxge_mcdi_state	state;
228227569Sphilip	efx_mcdi_transport_t	transport;
229278250Sarybchik
230278250Sarybchik	/* Only used in debugging output */
231278250Sarybchik	char			lock_name[SFXGE_LOCK_NAME_MAX];
232227569Sphilip};
233227569Sphilip
234227569Sphilipstruct sfxge_hw_stats {
235227569Sphilip	clock_t			update_time;
236227569Sphilip	efsys_mem_t		dma_buf;
237227569Sphilip	void			*decode_buf;
238227569Sphilip};
239227569Sphilip
240227569Sphilipenum sfxge_port_state {
241227569Sphilip	SFXGE_PORT_UNINITIALIZED = 0,
242227569Sphilip	SFXGE_PORT_INITIALIZED,
243227569Sphilip	SFXGE_PORT_STARTED
244227569Sphilip};
245227569Sphilip
246227569Sphilipstruct sfxge_port {
247227569Sphilip	struct sfxge_softc	*sc;
248227569Sphilip	struct mtx		lock;
249227569Sphilip	enum sfxge_port_state	init_state;
250227569Sphilip#ifndef SFXGE_HAVE_PAUSE_MEDIAOPTS
251227569Sphilip	unsigned int		wanted_fc;
252227569Sphilip#endif
253227569Sphilip	struct sfxge_hw_stats	phy_stats;
254227569Sphilip	struct sfxge_hw_stats	mac_stats;
255312160Sarybchik	uint16_t		stats_update_period_ms;
256227569Sphilip	efx_link_mode_t		link_mode;
257283514Sarybchik	uint8_t			mcast_addrs[EFX_MAC_MULTICAST_LIST_MAX *
258283514Sarybchik					    EFX_MAC_ADDR_LEN];
259283514Sarybchik	unsigned int		mcast_count;
260278250Sarybchik
261278250Sarybchik	/* Only used in debugging output */
262278250Sarybchik	char			lock_name[SFXGE_LOCK_NAME_MAX];
263227569Sphilip};
264227569Sphilip
265227569Sphilipenum sfxge_softc_state {
266227569Sphilip	SFXGE_UNINITIALIZED = 0,
267227569Sphilip	SFXGE_INITIALIZED,
268227569Sphilip	SFXGE_REGISTERED,
269227569Sphilip	SFXGE_STARTED
270227569Sphilip};
271227569Sphilip
272227569Sphilipstruct sfxge_softc {
273227569Sphilip	device_t			dev;
274227569Sphilip	struct sx			softc_lock;
275278250Sarybchik	char				softc_lock_name[SFXGE_LOCK_NAME_MAX];
276227569Sphilip	enum sfxge_softc_state		init_state;
277272325Sgnn	struct ifnet			*ifnet;
278227569Sphilip	unsigned int			if_flags;
279227569Sphilip	struct sysctl_oid		*stats_node;
280342452Sarybchik#if EFSYS_OPT_QSTATS
281342452Sarybchik	struct sysctl_oid		*evqs_stats_node;
282342452Sarybchik#endif
283272330Sgnn	struct sysctl_oid		*txqs_node;
284227569Sphilip
285227569Sphilip	struct task			task_reset;
286227569Sphilip
287227569Sphilip	efx_family_t			family;
288227569Sphilip	caddr_t				vpd_data;
289227569Sphilip	size_t				vpd_size;
290227569Sphilip	efx_nic_t			*enp;
291278250Sarybchik	efsys_lock_t			enp_lock;
292227569Sphilip
293342455Sarybchik	boolean_t			txq_dynamic_cksum_toggle_supported;
294342455Sarybchik
295272328Sgnn	unsigned int			rxq_entries;
296272328Sgnn	unsigned int			txq_entries;
297272328Sgnn
298272325Sgnn	bus_dma_tag_t			parent_dma_tag;
299227569Sphilip	efsys_bar_t			bar;
300227569Sphilip
301227569Sphilip	struct sfxge_intr		intr;
302227569Sphilip	struct sfxge_mcdi		mcdi;
303227569Sphilip	struct sfxge_port		port;
304227569Sphilip	uint32_t			buffer_table_next;
305227569Sphilip
306227569Sphilip	struct sfxge_evq		*evq[SFXGE_RX_SCALE_MAX];
307227569Sphilip	unsigned int			ev_moderation;
308277886Sarybchik#if EFSYS_OPT_QSTATS
309227569Sphilip	clock_t				ev_stats_update_time;
310227569Sphilip	uint64_t			ev_stats[EV_NQSTATS];
311277886Sarybchik#endif
312227569Sphilip
313277894Sarybchik	unsigned int			max_rss_channels;
314227569Sphilip	struct sfxge_rxq		*rxq[SFXGE_RX_SCALE_MAX];
315310831Sarybchik	unsigned int			rx_indir_table[EFX_RSS_TBL_SIZE];
316227569Sphilip
317227569Sphilip	struct sfxge_txq		*txq[SFXGE_TXQ_NTYPES + SFXGE_RX_SCALE_MAX];
318227569Sphilip
319227569Sphilip	struct ifmedia			media;
320227569Sphilip
321227569Sphilip	size_t				rx_prefix_size;
322227569Sphilip	size_t				rx_buffer_size;
323283514Sarybchik	size_t				rx_buffer_align;
324294996Sglebius	int				rx_cluster_size;
325227569Sphilip
326283514Sarybchik	unsigned int			evq_max;
327278940Sarybchik	unsigned int			evq_count;
328278939Sarybchik	unsigned int			rxq_count;
329278938Sarybchik	unsigned int			txq_count;
330283514Sarybchik
331294077Sarybchik	unsigned int			tso_fw_assisted;
332294077Sarybchik#define	SFXGE_FATSOV1	(1 << 0)
333294077Sarybchik#define	SFXGE_FATSOV2	(1 << 1)
334294077Sarybchik
335291843Sarybchik#if EFSYS_OPT_MCDI_LOGGING
336291843Sarybchik	int				mcdi_logging;
337291843Sarybchik#endif
338227569Sphilip};
339227569Sphilip
340311764Sarybchik#define	SFXGE_LINK_UP(sc) \
341311764Sarybchik	((sc)->port.link_mode != EFX_LINK_DOWN && \
342311764Sarybchik	 (sc)->port.link_mode != EFX_LINK_UNKNOWN)
343272325Sgnn#define	SFXGE_RUNNING(sc) ((sc)->ifnet->if_drv_flags & IFF_DRV_RUNNING)
344227569Sphilip
345272328Sgnn#define	SFXGE_PARAM(_name)	"hw.sfxge." #_name
346272328Sgnn
347272328SgnnSYSCTL_DECL(_hw_sfxge);
348272328Sgnn
349227569Sphilip/*
350227569Sphilip * From sfxge.c.
351227569Sphilip */
352227569Sphilipextern void sfxge_schedule_reset(struct sfxge_softc *sc);
353227569Sphilipextern void sfxge_sram_buf_tbl_alloc(struct sfxge_softc *sc, size_t n,
354227569Sphilip				     uint32_t *idp);
355227569Sphilip
356227569Sphilip/*
357227569Sphilip * From sfxge_dma.c.
358227569Sphilip */
359227569Sphilipextern int sfxge_dma_init(struct sfxge_softc *sc);
360227569Sphilipextern void sfxge_dma_fini(struct sfxge_softc *sc);
361227569Sphilipextern int sfxge_dma_alloc(struct sfxge_softc *sc, bus_size_t len,
362283514Sarybchik			   efsys_mem_t *esmp);
363227569Sphilipextern void sfxge_dma_free(efsys_mem_t *esmp);
364227569Sphilipextern int sfxge_dma_map_sg_collapse(bus_dma_tag_t tag, bus_dmamap_t map,
365283514Sarybchik				     struct mbuf **mp,
366283514Sarybchik				     bus_dma_segment_t *segs,
367283514Sarybchik				     int *nsegs, int maxsegs);
368227569Sphilip
369227569Sphilip/*
370227569Sphilip * From sfxge_ev.c.
371227569Sphilip */
372227569Sphilipextern int sfxge_ev_init(struct sfxge_softc *sc);
373227569Sphilipextern void sfxge_ev_fini(struct sfxge_softc *sc);
374227569Sphilipextern int sfxge_ev_start(struct sfxge_softc *sc);
375227569Sphilipextern void sfxge_ev_stop(struct sfxge_softc *sc);
376277884Sarybchikextern int sfxge_ev_qpoll(struct sfxge_evq *evq);
377227569Sphilip
378227569Sphilip/*
379227569Sphilip * From sfxge_intr.c.
380227569Sphilip */
381227569Sphilipextern int sfxge_intr_init(struct sfxge_softc *sc);
382227569Sphilipextern void sfxge_intr_fini(struct sfxge_softc *sc);
383227569Sphilipextern int sfxge_intr_start(struct sfxge_softc *sc);
384227569Sphilipextern void sfxge_intr_stop(struct sfxge_softc *sc);
385227569Sphilip
386227569Sphilip/*
387227569Sphilip * From sfxge_mcdi.c.
388227569Sphilip */
389227569Sphilipextern int sfxge_mcdi_init(struct sfxge_softc *sc);
390227569Sphilipextern void sfxge_mcdi_fini(struct sfxge_softc *sc);
391283514Sarybchikextern int sfxge_mcdi_ioctl(struct sfxge_softc *sc, sfxge_ioc_t *ip);
392227569Sphilip
393227569Sphilip/*
394283514Sarybchik * From sfxge_nvram.c.
395283514Sarybchik */
396283514Sarybchikextern int sfxge_nvram_ioctl(struct sfxge_softc *sc, sfxge_ioc_t *ip);
397283514Sarybchik
398283514Sarybchik/*
399227569Sphilip * From sfxge_port.c.
400227569Sphilip */
401227569Sphilipextern int sfxge_port_init(struct sfxge_softc *sc);
402227569Sphilipextern void sfxge_port_fini(struct sfxge_softc *sc);
403227569Sphilipextern int sfxge_port_start(struct sfxge_softc *sc);
404227569Sphilipextern void sfxge_port_stop(struct sfxge_softc *sc);
405227569Sphilipextern void sfxge_mac_link_update(struct sfxge_softc *sc,
406283514Sarybchik				  efx_link_mode_t mode);
407227569Sphilipextern int sfxge_mac_filter_set(struct sfxge_softc *sc);
408227569Sphilipextern int sfxge_port_ifmedia_init(struct sfxge_softc *sc);
409279184Sarybchikextern uint64_t sfxge_get_counter(struct ifnet *ifp, ift_counter c);
410227569Sphilip
411272325Sgnn#define	SFXGE_MAX_MTU (9 * 1024)
412227569Sphilip
413278250Sarybchik#define	SFXGE_ADAPTER_LOCK_INIT(_sc, _ifname)				\
414278250Sarybchik	do {								\
415278250Sarybchik		struct sfxge_softc *__sc = (_sc);			\
416278250Sarybchik									\
417278250Sarybchik		snprintf((__sc)->softc_lock_name,			\
418278250Sarybchik			 sizeof((__sc)->softc_lock_name),		\
419278250Sarybchik			 "%s:softc", (_ifname));			\
420278250Sarybchik		sx_init(&(__sc)->softc_lock, (__sc)->softc_lock_name);	\
421278250Sarybchik	} while (B_FALSE)
422278221Sarybchik#define	SFXGE_ADAPTER_LOCK_DESTROY(_sc)					\
423278221Sarybchik	sx_destroy(&(_sc)->softc_lock)
424278221Sarybchik#define	SFXGE_ADAPTER_LOCK(_sc)						\
425278221Sarybchik	sx_xlock(&(_sc)->softc_lock)
426278221Sarybchik#define	SFXGE_ADAPTER_UNLOCK(_sc)					\
427278221Sarybchik	sx_xunlock(&(_sc)->softc_lock)
428278221Sarybchik#define	SFXGE_ADAPTER_LOCK_ASSERT_OWNED(_sc)				\
429278221Sarybchik	sx_assert(&(_sc)->softc_lock, LA_XLOCKED)
430278221Sarybchik
431278250Sarybchik#define	SFXGE_PORT_LOCK_INIT(_port, _ifname)				\
432278250Sarybchik	do {								\
433278250Sarybchik		struct sfxge_port *__port = (_port);			\
434278250Sarybchik									\
435278250Sarybchik		snprintf((__port)->lock_name,				\
436278250Sarybchik			 sizeof((__port)->lock_name),			\
437278250Sarybchik			 "%s:port", (_ifname));				\
438278250Sarybchik		mtx_init(&(__port)->lock, (__port)->lock_name,		\
439278250Sarybchik			 NULL, MTX_DEF);				\
440278250Sarybchik	} while (B_FALSE)
441278221Sarybchik#define	SFXGE_PORT_LOCK_DESTROY(_port)					\
442278221Sarybchik	mtx_destroy(&(_port)->lock)
443278221Sarybchik#define	SFXGE_PORT_LOCK(_port)						\
444278221Sarybchik	mtx_lock(&(_port)->lock)
445278221Sarybchik#define	SFXGE_PORT_UNLOCK(_port)					\
446278221Sarybchik	mtx_unlock(&(_port)->lock)
447278221Sarybchik#define	SFXGE_PORT_LOCK_ASSERT_OWNED(_port)				\
448278221Sarybchik	mtx_assert(&(_port)->lock, MA_OWNED)
449278221Sarybchik
450278250Sarybchik#define	SFXGE_MCDI_LOCK_INIT(_mcdi, _ifname)				\
451278250Sarybchik	do {								\
452278250Sarybchik		struct sfxge_mcdi  *__mcdi = (_mcdi);			\
453278250Sarybchik									\
454278250Sarybchik		snprintf((__mcdi)->lock_name,				\
455278250Sarybchik			 sizeof((__mcdi)->lock_name),			\
456278250Sarybchik			 "%s:mcdi", (_ifname));				\
457278250Sarybchik		mtx_init(&(__mcdi)->lock, (__mcdi)->lock_name,		\
458278250Sarybchik			 NULL, MTX_DEF);				\
459278250Sarybchik	} while (B_FALSE)
460278221Sarybchik#define	SFXGE_MCDI_LOCK_DESTROY(_mcdi)					\
461278221Sarybchik	mtx_destroy(&(_mcdi)->lock)
462278221Sarybchik#define	SFXGE_MCDI_LOCK(_mcdi)						\
463278221Sarybchik	mtx_lock(&(_mcdi)->lock)
464278221Sarybchik#define	SFXGE_MCDI_UNLOCK(_mcdi)					\
465278221Sarybchik	mtx_unlock(&(_mcdi)->lock)
466278221Sarybchik#define	SFXGE_MCDI_LOCK_ASSERT_OWNED(_mcdi)				\
467278221Sarybchik	mtx_assert(&(_mcdi)->lock, MA_OWNED)
468278221Sarybchik
469278250Sarybchik#define	SFXGE_EVQ_LOCK_INIT(_evq, _ifname, _evq_index)			\
470278250Sarybchik	do {								\
471278250Sarybchik		struct sfxge_evq  *__evq = (_evq);			\
472278250Sarybchik									\
473278250Sarybchik		snprintf((__evq)->lock_name,				\
474278250Sarybchik			 sizeof((__evq)->lock_name),			\
475278250Sarybchik			 "%s:evq%u", (_ifname), (_evq_index));		\
476278250Sarybchik		mtx_init(&(__evq)->lock, (__evq)->lock_name,		\
477278250Sarybchik			 NULL, MTX_DEF);				\
478278250Sarybchik	} while (B_FALSE)
479278221Sarybchik#define	SFXGE_EVQ_LOCK_DESTROY(_evq)					\
480278221Sarybchik	mtx_destroy(&(_evq)->lock)
481278221Sarybchik#define	SFXGE_EVQ_LOCK(_evq)						\
482278221Sarybchik	mtx_lock(&(_evq)->lock)
483278221Sarybchik#define	SFXGE_EVQ_UNLOCK(_evq)						\
484278221Sarybchik	mtx_unlock(&(_evq)->lock)
485278221Sarybchik#define	SFXGE_EVQ_LOCK_ASSERT_OWNED(_evq)				\
486278221Sarybchik	mtx_assert(&(_evq)->lock, MA_OWNED)
487278221Sarybchik
488227569Sphilip#endif /* _SFXGE_H */
489