1227569Sphilip/*-
2301388Sarybchik * 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
9284555Sarybchik * modification, are permitted provided that the following conditions are met:
10227569Sphilip *
11284555Sarybchik * 1. Redistributions of source code must retain the above copyright notice,
12284555Sarybchik *    this list of conditions and the following disclaimer.
13284555Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice,
14284555Sarybchik *    this list of conditions and the following disclaimer in the documentation
15284555Sarybchik *    and/or other materials provided with the distribution.
16227569Sphilip *
17284555Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18284555Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19284555Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20284555Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21284555Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22284555Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23284555Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24284555Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25284555Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26284555Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27284555Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28284555Sarybchik *
29284555Sarybchik * The views and conclusions contained in the software and documentation are
30284555Sarybchik * those of the authors and should not be interpreted as representing official
31284555Sarybchik * policies, either expressed or implied, of the FreeBSD Project.
32284555Sarybchik *
33227569Sphilip * $FreeBSD: stable/10/sys/dev/sfxge/sfxge.h 342529 2018-12-26 10:39:34Z arybchik $
34227569Sphilip */
35227569Sphilip
36227569Sphilip#ifndef _SFXGE_H
37280501Sarybchik#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>
48227569Sphilip#include <net/if_media.h>
49227569Sphilip#include <net/if_types.h>
50227569Sphilip
51284555Sarybchik#include "sfxge_ioc.h"
52284555Sarybchik
53227569Sphilip/*
54284555Sarybchik * Debugging
55284555Sarybchik */
56284555Sarybchik#if 0
57284555Sarybchik#define	DBGPRINT(dev, fmt, args...) \
58284555Sarybchik	device_printf(dev, "%s: " fmt "\n", __func__, ## args)
59284555Sarybchik#else
60284555Sarybchik#define	DBGPRINT(dev, fmt, args...)
61284555Sarybchik#endif
62284555Sarybchik
63284555Sarybchik/*
64227569Sphilip * Backward-compatibility
65227569Sphilip */
66227569Sphilip#ifndef CACHE_LINE_SIZE
67227569Sphilip/* This should be right on most machines the driver will be used on, and
68227569Sphilip * we needn't care too much about wasting a few KB per interface.
69227569Sphilip */
70280501Sarybchik#define	CACHE_LINE_SIZE 128
71227569Sphilip#endif
72280612Sarybchik
73227569Sphilip#ifndef IFCAP_LINKSTATE
74280501Sarybchik#define	IFCAP_LINKSTATE 0
75227569Sphilip#endif
76280612Sarybchik
77227569Sphilip#ifndef IFCAP_VLAN_HWTSO
78280501Sarybchik#define	IFCAP_VLAN_HWTSO 0
79227569Sphilip#endif
80280612Sarybchik
81227569Sphilip#ifndef IFM_10G_T
82280501Sarybchik#define	IFM_10G_T IFM_UNKNOWN
83227569Sphilip#endif
84280612Sarybchik
85227569Sphilip#ifndef IFM_10G_KX4
86280501Sarybchik#define	IFM_10G_KX4 IFM_10G_CX4
87227569Sphilip#endif
88280612Sarybchik
89284555Sarybchik#ifndef IFM_40G_CR4
90284555Sarybchik#define	IFM_40G_CR4 IFM_UNKNOWN
91284555Sarybchik#endif
92284555Sarybchik
93227569Sphilip#if (__FreeBSD_version >= 800501 && __FreeBSD_version < 900000) || \
94227569Sphilip	__FreeBSD_version >= 900003
95280501Sarybchik#define	SFXGE_HAVE_DESCRIBE_INTR
96227569Sphilip#endif
97280612Sarybchik
98227569Sphilip#ifdef IFM_ETH_RXPAUSE
99280501Sarybchik#define	SFXGE_HAVE_PAUSE_MEDIAOPTS
100227569Sphilip#endif
101280612Sarybchik
102227569Sphilip#ifndef CTLTYPE_U64
103280501Sarybchik#define	CTLTYPE_U64 CTLTYPE_QUAD
104227569Sphilip#endif
105227569Sphilip
106227569Sphilip#include "sfxge_rx.h"
107227569Sphilip#include "sfxge_tx.h"
108227569Sphilip
109280502Sarybchik#define	ROUNDUP_POW_OF_TWO(_n)	(1ULL << flsl((_n) - 1))
110280502Sarybchik
111280501Sarybchik#define	SFXGE_IP_ALIGN	2
112227569Sphilip
113280501Sarybchik#define	SFXGE_ETHERTYPE_LOOPBACK	0x9000	/* Xerox loopback */
114227569Sphilip
115301313Sarybchik
116301313Sarybchik#define	SFXGE_MAGIC_RESERVED		0x8000
117301313Sarybchik
118301313Sarybchik#define	SFXGE_MAGIC_DMAQ_LABEL_WIDTH	6
119301313Sarybchik#define	SFXGE_MAGIC_DMAQ_LABEL_MASK \
120301313Sarybchik	((1 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH) - 1)
121301313Sarybchik
122301314Sarybchikenum sfxge_sw_ev {
123301314Sarybchik	SFXGE_SW_EV_RX_QFLUSH_DONE = 1,
124301314Sarybchik	SFXGE_SW_EV_RX_QFLUSH_FAILED,
125301314Sarybchik	SFXGE_SW_EV_RX_QREFILL,
126301314Sarybchik	SFXGE_SW_EV_TX_QFLUSH_DONE,
127301314Sarybchik};
128301313Sarybchik
129301314Sarybchik#define	SFXGE_SW_EV_MAGIC(_sw_ev) \
130301314Sarybchik	(SFXGE_MAGIC_RESERVED | ((_sw_ev) << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
131301313Sarybchik
132301315Sarybchikstatic inline uint16_t
133301315Sarybchiksfxge_sw_ev_mk_magic(enum sfxge_sw_ev sw_ev, unsigned int label)
134301315Sarybchik{
135301315Sarybchik	KASSERT((label & SFXGE_MAGIC_DMAQ_LABEL_MASK) == label,
136301315Sarybchik	    ("(label & SFXGE_MAGIC_DMAQ_LABEL_MASK) != label"));
137301315Sarybchik	return SFXGE_SW_EV_MAGIC(sw_ev) | label;
138301315Sarybchik}
139301315Sarybchik
140301315Sarybchikstatic inline uint16_t
141301315Sarybchiksfxge_sw_ev_rxq_magic(enum sfxge_sw_ev sw_ev, struct sfxge_rxq *rxq)
142301315Sarybchik{
143301315Sarybchik	return sfxge_sw_ev_mk_magic(sw_ev, 0);
144301315Sarybchik}
145301315Sarybchik
146301315Sarybchikstatic inline uint16_t
147301315Sarybchiksfxge_sw_ev_txq_magic(enum sfxge_sw_ev sw_ev, struct sfxge_txq *txq)
148301315Sarybchik{
149301315Sarybchik	return sfxge_sw_ev_mk_magic(sw_ev, txq->type);
150301315Sarybchik}
151301315Sarybchik
152227569Sphilipenum sfxge_evq_state {
153227569Sphilip	SFXGE_EVQ_UNINITIALIZED = 0,
154227569Sphilip	SFXGE_EVQ_INITIALIZED,
155227569Sphilip	SFXGE_EVQ_STARTING,
156227569Sphilip	SFXGE_EVQ_STARTED
157227569Sphilip};
158227569Sphilip
159227569Sphilip#define	SFXGE_EV_BATCH	16384
160227569Sphilip
161312167Sarybchik#define	SFXGE_STATS_UPDATE_PERIOD_MS	1000
162292089Sarybchik
163227569Sphilipstruct sfxge_evq {
164280511Sarybchik	/* Structure members below are sorted by usage order */
165280511Sarybchik	struct sfxge_softc	*sc;
166280511Sarybchik	struct mtx		lock;
167280511Sarybchik	unsigned int		index;
168227569Sphilip	enum sfxge_evq_state	init_state;
169227569Sphilip	efsys_mem_t		mem;
170227569Sphilip	efx_evq_t		*common;
171227569Sphilip	unsigned int		read_ptr;
172280511Sarybchik	boolean_t		exception;
173227569Sphilip	unsigned int		rx_done;
174227569Sphilip	unsigned int		tx_done;
175227569Sphilip
176227569Sphilip	/* Linked list of TX queues with completions to process */
177227569Sphilip	struct sfxge_txq	*txq;
178227569Sphilip	struct sfxge_txq	**txqs;
179227569Sphilip
180280511Sarybchik	/* Structure members not used on event processing path */
181280511Sarybchik	unsigned int		buf_base_id;
182280511Sarybchik	unsigned int		entries;
183280524Sarybchik	char			lock_name[SFXGE_LOCK_NAME_MAX];
184342523Sarybchik#if EFSYS_OPT_QSTATS
185342523Sarybchik	clock_t			stats_update_time;
186342523Sarybchik	uint64_t		stats[EV_NQSTATS];
187342523Sarybchik#endif
188280511Sarybchik} __aligned(CACHE_LINE_SIZE);
189280511Sarybchik
190227569Sphilip#define	SFXGE_NDESCS	1024
191227569Sphilip#define	SFXGE_MODERATION	30
192227569Sphilip
193227569Sphilipenum sfxge_intr_state {
194227569Sphilip	SFXGE_INTR_UNINITIALIZED = 0,
195227569Sphilip	SFXGE_INTR_INITIALIZED,
196227569Sphilip	SFXGE_INTR_TESTING,
197227569Sphilip	SFXGE_INTR_STARTED
198227569Sphilip};
199227569Sphilip
200227569Sphilipstruct sfxge_intr_hdl {
201280501Sarybchik	int			eih_rid;
202280501Sarybchik	void			*eih_tag;
203280501Sarybchik	struct resource		*eih_res;
204227569Sphilip};
205227569Sphilip
206227569Sphilipstruct sfxge_intr {
207227569Sphilip	enum sfxge_intr_state	state;
208227569Sphilip	struct resource		*msix_res;
209227569Sphilip	struct sfxge_intr_hdl	*table;
210227569Sphilip	int			n_alloc;
211227569Sphilip	int			type;
212227569Sphilip	efsys_mem_t		status;
213227569Sphilip	uint32_t		zero_count;
214227569Sphilip};
215227569Sphilip
216227569Sphilipenum sfxge_mcdi_state {
217227569Sphilip	SFXGE_MCDI_UNINITIALIZED = 0,
218227569Sphilip	SFXGE_MCDI_INITIALIZED,
219227569Sphilip	SFXGE_MCDI_BUSY,
220227569Sphilip	SFXGE_MCDI_COMPLETED
221227569Sphilip};
222227569Sphilip
223227569Sphilipstruct sfxge_mcdi {
224227569Sphilip	struct mtx		lock;
225284555Sarybchik	efsys_mem_t		mem;
226227569Sphilip	enum sfxge_mcdi_state	state;
227227569Sphilip	efx_mcdi_transport_t	transport;
228280524Sarybchik
229280524Sarybchik	/* Only used in debugging output */
230280524Sarybchik	char			lock_name[SFXGE_LOCK_NAME_MAX];
231227569Sphilip};
232227569Sphilip
233227569Sphilipstruct sfxge_hw_stats {
234227569Sphilip	clock_t			update_time;
235227569Sphilip	efsys_mem_t		dma_buf;
236227569Sphilip	void			*decode_buf;
237227569Sphilip};
238227569Sphilip
239227569Sphilipenum sfxge_port_state {
240227569Sphilip	SFXGE_PORT_UNINITIALIZED = 0,
241227569Sphilip	SFXGE_PORT_INITIALIZED,
242227569Sphilip	SFXGE_PORT_STARTED
243227569Sphilip};
244227569Sphilip
245227569Sphilipstruct sfxge_port {
246227569Sphilip	struct sfxge_softc	*sc;
247227569Sphilip	struct mtx		lock;
248227569Sphilip	enum sfxge_port_state	init_state;
249227569Sphilip#ifndef SFXGE_HAVE_PAUSE_MEDIAOPTS
250227569Sphilip	unsigned int		wanted_fc;
251227569Sphilip#endif
252227569Sphilip	struct sfxge_hw_stats	phy_stats;
253227569Sphilip	struct sfxge_hw_stats	mac_stats;
254312168Sarybchik	uint16_t		stats_update_period_ms;
255227569Sphilip	efx_link_mode_t		link_mode;
256284555Sarybchik	uint8_t			mcast_addrs[EFX_MAC_MULTICAST_LIST_MAX *
257284555Sarybchik					    EFX_MAC_ADDR_LEN];
258284555Sarybchik	unsigned int		mcast_count;
259280524Sarybchik
260280524Sarybchik	/* Only used in debugging output */
261280524Sarybchik	char			lock_name[SFXGE_LOCK_NAME_MAX];
262227569Sphilip};
263227569Sphilip
264227569Sphilipenum sfxge_softc_state {
265227569Sphilip	SFXGE_UNINITIALIZED = 0,
266227569Sphilip	SFXGE_INITIALIZED,
267227569Sphilip	SFXGE_REGISTERED,
268227569Sphilip	SFXGE_STARTED
269227569Sphilip};
270227569Sphilip
271227569Sphilipstruct sfxge_softc {
272227569Sphilip	device_t			dev;
273227569Sphilip	struct sx			softc_lock;
274280524Sarybchik	char				softc_lock_name[SFXGE_LOCK_NAME_MAX];
275227569Sphilip	enum sfxge_softc_state		init_state;
276280501Sarybchik	struct ifnet			*ifnet;
277227569Sphilip	unsigned int			if_flags;
278227569Sphilip	struct sysctl_oid		*stats_node;
279342523Sarybchik#if EFSYS_OPT_QSTATS
280342523Sarybchik	struct sysctl_oid		*evqs_stats_node;
281342523Sarybchik#endif
282280504Sarybchik	struct sysctl_oid		*txqs_node;
283227569Sphilip
284227569Sphilip	struct task			task_reset;
285227569Sphilip
286227569Sphilip	efx_family_t			family;
287227569Sphilip	caddr_t				vpd_data;
288227569Sphilip	size_t				vpd_size;
289227569Sphilip	efx_nic_t			*enp;
290280524Sarybchik	efsys_lock_t			enp_lock;
291227569Sphilip
292342529Sarybchik	boolean_t			txq_dynamic_cksum_toggle_supported;
293342529Sarybchik
294280502Sarybchik	unsigned int			rxq_entries;
295280502Sarybchik	unsigned int			txq_entries;
296280502Sarybchik
297280501Sarybchik	bus_dma_tag_t			parent_dma_tag;
298227569Sphilip	efsys_bar_t			bar;
299227569Sphilip
300227569Sphilip	struct sfxge_intr		intr;
301227569Sphilip	struct sfxge_mcdi		mcdi;
302227569Sphilip	struct sfxge_port		port;
303227569Sphilip	uint32_t			buffer_table_next;
304227569Sphilip
305227569Sphilip	struct sfxge_evq		*evq[SFXGE_RX_SCALE_MAX];
306227569Sphilip	unsigned int			ev_moderation;
307280510Sarybchik#if EFSYS_OPT_QSTATS
308227569Sphilip	clock_t				ev_stats_update_time;
309227569Sphilip	uint64_t			ev_stats[EV_NQSTATS];
310280510Sarybchik#endif
311227569Sphilip
312280518Sarybchik	unsigned int			max_rss_channels;
313227569Sphilip	struct sfxge_rxq		*rxq[SFXGE_RX_SCALE_MAX];
314310830Sarybchik	unsigned int			rx_indir_table[EFX_RSS_TBL_SIZE];
315227569Sphilip
316227569Sphilip	struct sfxge_txq		*txq[SFXGE_TXQ_NTYPES + SFXGE_RX_SCALE_MAX];
317227569Sphilip
318227569Sphilip	struct ifmedia			media;
319227569Sphilip
320227569Sphilip	size_t				rx_prefix_size;
321227569Sphilip	size_t				rx_buffer_size;
322284555Sarybchik	size_t				rx_buffer_align;
323227569Sphilip	uma_zone_t			rx_buffer_zone;
324227569Sphilip
325292089Sarybchik	struct callout			tick_callout;
326292089Sarybchik
327284555Sarybchik	unsigned int			evq_max;
328280541Sarybchik	unsigned int			evq_count;
329280539Sarybchik	unsigned int			rxq_count;
330280538Sarybchik	unsigned int			txq_count;
331284555Sarybchik
332294390Sarybchik	unsigned int			tso_fw_assisted;
333294390Sarybchik#define	SFXGE_FATSOV1	(1 << 0)
334294390Sarybchik#define	SFXGE_FATSOV2	(1 << 1)
335294390Sarybchik
336293946Sarybchik#if EFSYS_OPT_MCDI_LOGGING
337293946Sarybchik	int				mcdi_logging;
338293946Sarybchik#endif
339227569Sphilip};
340227569Sphilip
341311767Sarybchik#define	SFXGE_LINK_UP(sc) \
342311767Sarybchik	((sc)->port.link_mode != EFX_LINK_DOWN && \
343311767Sarybchik	 (sc)->port.link_mode != EFX_LINK_UNKNOWN)
344280501Sarybchik#define	SFXGE_RUNNING(sc) ((sc)->ifnet->if_drv_flags & IFF_DRV_RUNNING)
345227569Sphilip
346280502Sarybchik#define	SFXGE_PARAM(_name)	"hw.sfxge." #_name
347280502Sarybchik
348280502SarybchikSYSCTL_DECL(_hw_sfxge);
349280502Sarybchik
350227569Sphilip/*
351227569Sphilip * From sfxge.c.
352227569Sphilip */
353227569Sphilipextern void sfxge_schedule_reset(struct sfxge_softc *sc);
354227569Sphilipextern void sfxge_sram_buf_tbl_alloc(struct sfxge_softc *sc, size_t n,
355227569Sphilip				     uint32_t *idp);
356227569Sphilip
357227569Sphilip/*
358227569Sphilip * From sfxge_dma.c.
359227569Sphilip */
360227569Sphilipextern int sfxge_dma_init(struct sfxge_softc *sc);
361227569Sphilipextern void sfxge_dma_fini(struct sfxge_softc *sc);
362227569Sphilipextern int sfxge_dma_alloc(struct sfxge_softc *sc, bus_size_t len,
363284555Sarybchik			   efsys_mem_t *esmp);
364227569Sphilipextern void sfxge_dma_free(efsys_mem_t *esmp);
365227569Sphilipextern int sfxge_dma_map_sg_collapse(bus_dma_tag_t tag, bus_dmamap_t map,
366284555Sarybchik				     struct mbuf **mp,
367284555Sarybchik				     bus_dma_segment_t *segs,
368284555Sarybchik				     int *nsegs, int maxsegs);
369227569Sphilip
370227569Sphilip/*
371227569Sphilip * From sfxge_ev.c.
372227569Sphilip */
373227569Sphilipextern int sfxge_ev_init(struct sfxge_softc *sc);
374227569Sphilipextern void sfxge_ev_fini(struct sfxge_softc *sc);
375227569Sphilipextern int sfxge_ev_start(struct sfxge_softc *sc);
376227569Sphilipextern void sfxge_ev_stop(struct sfxge_softc *sc);
377280508Sarybchikextern int sfxge_ev_qpoll(struct sfxge_evq *evq);
378227569Sphilip
379227569Sphilip/*
380227569Sphilip * From sfxge_intr.c.
381227569Sphilip */
382227569Sphilipextern int sfxge_intr_init(struct sfxge_softc *sc);
383227569Sphilipextern void sfxge_intr_fini(struct sfxge_softc *sc);
384227569Sphilipextern int sfxge_intr_start(struct sfxge_softc *sc);
385227569Sphilipextern void sfxge_intr_stop(struct sfxge_softc *sc);
386227569Sphilip
387227569Sphilip/*
388227569Sphilip * From sfxge_mcdi.c.
389227569Sphilip */
390227569Sphilipextern int sfxge_mcdi_init(struct sfxge_softc *sc);
391227569Sphilipextern void sfxge_mcdi_fini(struct sfxge_softc *sc);
392284555Sarybchikextern int sfxge_mcdi_ioctl(struct sfxge_softc *sc, sfxge_ioc_t *ip);
393227569Sphilip
394227569Sphilip/*
395284555Sarybchik * From sfxge_nvram.c.
396284555Sarybchik */
397284555Sarybchikextern int sfxge_nvram_ioctl(struct sfxge_softc *sc, sfxge_ioc_t *ip);
398284555Sarybchik
399284555Sarybchik/*
400227569Sphilip * From sfxge_port.c.
401227569Sphilip */
402227569Sphilipextern int sfxge_port_init(struct sfxge_softc *sc);
403227569Sphilipextern void sfxge_port_fini(struct sfxge_softc *sc);
404227569Sphilipextern int sfxge_port_start(struct sfxge_softc *sc);
405227569Sphilipextern void sfxge_port_stop(struct sfxge_softc *sc);
406227569Sphilipextern void sfxge_mac_link_update(struct sfxge_softc *sc,
407284555Sarybchik				  efx_link_mode_t mode);
408227569Sphilipextern int sfxge_mac_filter_set(struct sfxge_softc *sc);
409227569Sphilipextern int sfxge_port_ifmedia_init(struct sfxge_softc *sc);
410292089Sarybchikextern void sfxge_port_update_stats(struct sfxge_softc *sc);
411227569Sphilip
412280501Sarybchik#define	SFXGE_MAX_MTU (9 * 1024)
413227569Sphilip
414280524Sarybchik#define	SFXGE_ADAPTER_LOCK_INIT(_sc, _ifname)				\
415280524Sarybchik	do {								\
416280524Sarybchik		struct sfxge_softc *__sc = (_sc);			\
417280524Sarybchik									\
418280524Sarybchik		snprintf((__sc)->softc_lock_name,			\
419280524Sarybchik			 sizeof((__sc)->softc_lock_name),		\
420280524Sarybchik			 "%s:softc", (_ifname));			\
421280524Sarybchik		sx_init(&(__sc)->softc_lock, (__sc)->softc_lock_name);	\
422280524Sarybchik	} while (B_FALSE)
423280522Sarybchik#define	SFXGE_ADAPTER_LOCK_DESTROY(_sc)					\
424280522Sarybchik	sx_destroy(&(_sc)->softc_lock)
425280522Sarybchik#define	SFXGE_ADAPTER_LOCK(_sc)						\
426280522Sarybchik	sx_xlock(&(_sc)->softc_lock)
427280522Sarybchik#define	SFXGE_ADAPTER_UNLOCK(_sc)					\
428280522Sarybchik	sx_xunlock(&(_sc)->softc_lock)
429280522Sarybchik#define	SFXGE_ADAPTER_LOCK_ASSERT_OWNED(_sc)				\
430280522Sarybchik	sx_assert(&(_sc)->softc_lock, LA_XLOCKED)
431280522Sarybchik
432280524Sarybchik#define	SFXGE_PORT_LOCK_INIT(_port, _ifname)				\
433280524Sarybchik	do {								\
434280524Sarybchik		struct sfxge_port *__port = (_port);			\
435280524Sarybchik									\
436280524Sarybchik		snprintf((__port)->lock_name,				\
437280524Sarybchik			 sizeof((__port)->lock_name),			\
438280524Sarybchik			 "%s:port", (_ifname));				\
439280524Sarybchik		mtx_init(&(__port)->lock, (__port)->lock_name,		\
440280524Sarybchik			 NULL, MTX_DEF);				\
441280524Sarybchik	} while (B_FALSE)
442280522Sarybchik#define	SFXGE_PORT_LOCK_DESTROY(_port)					\
443280522Sarybchik	mtx_destroy(&(_port)->lock)
444280522Sarybchik#define	SFXGE_PORT_LOCK(_port)						\
445280522Sarybchik	mtx_lock(&(_port)->lock)
446280522Sarybchik#define	SFXGE_PORT_UNLOCK(_port)					\
447280522Sarybchik	mtx_unlock(&(_port)->lock)
448280522Sarybchik#define	SFXGE_PORT_LOCK_ASSERT_OWNED(_port)				\
449280522Sarybchik	mtx_assert(&(_port)->lock, MA_OWNED)
450280522Sarybchik
451280524Sarybchik#define	SFXGE_MCDI_LOCK_INIT(_mcdi, _ifname)				\
452280524Sarybchik	do {								\
453280524Sarybchik		struct sfxge_mcdi  *__mcdi = (_mcdi);			\
454280524Sarybchik									\
455280524Sarybchik		snprintf((__mcdi)->lock_name,				\
456280524Sarybchik			 sizeof((__mcdi)->lock_name),			\
457280524Sarybchik			 "%s:mcdi", (_ifname));				\
458280524Sarybchik		mtx_init(&(__mcdi)->lock, (__mcdi)->lock_name,		\
459280524Sarybchik			 NULL, MTX_DEF);				\
460280524Sarybchik	} while (B_FALSE)
461280522Sarybchik#define	SFXGE_MCDI_LOCK_DESTROY(_mcdi)					\
462280522Sarybchik	mtx_destroy(&(_mcdi)->lock)
463280522Sarybchik#define	SFXGE_MCDI_LOCK(_mcdi)						\
464280522Sarybchik	mtx_lock(&(_mcdi)->lock)
465280522Sarybchik#define	SFXGE_MCDI_UNLOCK(_mcdi)					\
466280522Sarybchik	mtx_unlock(&(_mcdi)->lock)
467280522Sarybchik#define	SFXGE_MCDI_LOCK_ASSERT_OWNED(_mcdi)				\
468280522Sarybchik	mtx_assert(&(_mcdi)->lock, MA_OWNED)
469280522Sarybchik
470280524Sarybchik#define	SFXGE_EVQ_LOCK_INIT(_evq, _ifname, _evq_index)			\
471280524Sarybchik	do {								\
472280524Sarybchik		struct sfxge_evq  *__evq = (_evq);			\
473280524Sarybchik									\
474280524Sarybchik		snprintf((__evq)->lock_name,				\
475280524Sarybchik			 sizeof((__evq)->lock_name),			\
476280524Sarybchik			 "%s:evq%u", (_ifname), (_evq_index));		\
477280524Sarybchik		mtx_init(&(__evq)->lock, (__evq)->lock_name,		\
478280524Sarybchik			 NULL, MTX_DEF);				\
479280524Sarybchik	} while (B_FALSE)
480280522Sarybchik#define	SFXGE_EVQ_LOCK_DESTROY(_evq)					\
481280522Sarybchik	mtx_destroy(&(_evq)->lock)
482280522Sarybchik#define	SFXGE_EVQ_LOCK(_evq)						\
483280522Sarybchik	mtx_lock(&(_evq)->lock)
484280522Sarybchik#define	SFXGE_EVQ_UNLOCK(_evq)						\
485280522Sarybchik	mtx_unlock(&(_evq)->lock)
486280522Sarybchik#define	SFXGE_EVQ_LOCK_ASSERT_OWNED(_evq)				\
487280522Sarybchik	mtx_assert(&(_evq)->lock, MA_OWNED)
488280522Sarybchik
489227569Sphilip#endif /* _SFXGE_H */
490