xref: /illumos-gate/usr/src/uts/common/io/xge/drv/xgell.h (revision 7eced415)
1a23fd118Syl /*
2a23fd118Syl  * CDDL HEADER START
3a23fd118Syl  *
4a23fd118Syl  * The contents of this file are subject to the terms of the
5a23fd118Syl  * Common Development and Distribution License (the "License").
6a23fd118Syl  * You may not use this file except in compliance with the License.
7a23fd118Syl  *
8a23fd118Syl  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9a23fd118Syl  * or http://www.opensolaris.org/os/licensing.
10a23fd118Syl  * See the License for the specific language governing permissions
11a23fd118Syl  * and limitations under the License.
12a23fd118Syl  *
13a23fd118Syl  * When distributing Covered Code, include this CDDL HEADER in each
14a23fd118Syl  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15a23fd118Syl  * If applicable, add the following below this CDDL HEADER, with the
16a23fd118Syl  * fields enclosed by brackets "[]" replaced with your own identifying
17a23fd118Syl  * information: Portions Copyright [yyyy] [name of copyright owner]
18a23fd118Syl  *
19a23fd118Syl  * CDDL HEADER END
20a23fd118Syl  */
21a23fd118Syl 
22a23fd118Syl /*
23*7eced415Sxw  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24a23fd118Syl  * Use is subject to license terms.
25a23fd118Syl  */
26a23fd118Syl 
27a23fd118Syl /*
28a23fd118Syl  *  Copyright (c) 2002-2005 Neterion, Inc.
29a23fd118Syl  *  All right Reserved.
30a23fd118Syl  *
31a23fd118Syl  *  FileName :    xgell.h
32a23fd118Syl  *
33a23fd118Syl  *  Description:  Link Layer driver declaration
34a23fd118Syl  *
35a23fd118Syl  */
36a23fd118Syl 
37a23fd118Syl #ifndef _SYS_XGELL_H
38a23fd118Syl #define	_SYS_XGELL_H
39a23fd118Syl 
40a23fd118Syl #pragma ident	"%Z%%M%	%I%	%E% SMI"
41a23fd118Syl 
42a23fd118Syl #include <sys/types.h>
43a23fd118Syl #include <sys/errno.h>
44a23fd118Syl #include <sys/param.h>
45a23fd118Syl #include <sys/stropts.h>
46a23fd118Syl #include <sys/stream.h>
47a23fd118Syl #include <sys/strsubr.h>
48a23fd118Syl #include <sys/kmem.h>
49a23fd118Syl #include <sys/conf.h>
50a23fd118Syl #include <sys/devops.h>
51a23fd118Syl #include <sys/ksynch.h>
52a23fd118Syl #include <sys/stat.h>
53a23fd118Syl #include <sys/modctl.h>
54a23fd118Syl #include <sys/debug.h>
55a23fd118Syl #include <sys/pci.h>
56a23fd118Syl #include <sys/ethernet.h>
57a23fd118Syl #include <sys/vlan.h>
58a23fd118Syl #include <sys/dlpi.h>
59a23fd118Syl #include <sys/taskq.h>
60a23fd118Syl #include <sys/cyclic.h>
61a23fd118Syl 
62a23fd118Syl #include <sys/pattr.h>
63a23fd118Syl #include <sys/strsun.h>
64a23fd118Syl 
65a23fd118Syl #include <sys/mac.h>
66ba2e4443Sseb #include <sys/mac_ether.h>
67a23fd118Syl 
68a23fd118Syl #ifdef __cplusplus
69a23fd118Syl extern "C" {
70a23fd118Syl #endif
71a23fd118Syl 
72*7eced415Sxw #define	XGELL_DESC		"Xframe I/II 10Gb Ethernet 1.11"
73a23fd118Syl #define	XGELL_IFNAME		"xge"
74a23fd118Syl #define	XGELL_TX_LEVEL_LOW	8
75a23fd118Syl #define	XGELL_TX_LEVEL_HIGH	32
76*7eced415Sxw #define	XGELL_TX_LEVEL_CHECK	3
77*7eced415Sxw #define	XGELL_MAX_RING_DEFAULT	8
78*7eced415Sxw #define	XGELL_MAX_FIFO_DEFAULT	1
79a23fd118Syl 
80a23fd118Syl #include <xgehal.h>
81a23fd118Syl 
82*7eced415Sxw /*
83*7eced415Sxw  * The definition of XGELL_RX_BUFFER_RECYCLE_CACHE is an experimental value.
84*7eced415Sxw  * With this value, the lock contention between xgell_rx_buffer_recycle()
85*7eced415Sxw  * and xgell_rx_1b_compl() is reduced to great extent. And multiple rx rings
86*7eced415Sxw  * alleviate the lock contention further since each rx ring has its own mutex.
87*7eced415Sxw  */
88*7eced415Sxw #define	XGELL_RX_BUFFER_RECYCLE_CACHE	XGE_HAL_RING_RXDS_PER_BLOCK(1) * 2
89*7eced415Sxw #define	MSG_SIZE	64
90*7eced415Sxw 
918347601bSyl /*
928347601bSyl  * These default values can be overridden by vaules in xge.conf.
938347601bSyl  * In xge.conf user has to specify actual (not percentages) values.
948347601bSyl  */
958347601bSyl #define	XGELL_RX_BUFFER_TOTAL		XGE_HAL_RING_RXDS_PER_BLOCK(1) * 6
968347601bSyl #define	XGELL_RX_BUFFER_POST_HIWAT	XGE_HAL_RING_RXDS_PER_BLOCK(1) * 5
97a23fd118Syl 
988347601bSyl /* Control driver to copy or DMA received packets */
998347601bSyl #define	XGELL_RX_DMA_LOWAT		256
100a23fd118Syl 
101a23fd118Syl #define	XGELL_RING_MAIN_QID		0
102a23fd118Syl 
1038347601bSyl #if defined(__x86)
1048347601bSyl #define	XGELL_TX_DMA_LOWAT		128
1058347601bSyl #else
106*7eced415Sxw #define	XGELL_TX_DMA_LOWAT		512
1078347601bSyl #endif
1088347601bSyl 
1098347601bSyl /*
1108347601bSyl  * Try to collapse up to XGELL_RX_PKT_BURST packets into single mblk
1118347601bSyl  * sequence before mac_rx() is called.
1128347601bSyl  */
1138347601bSyl #define	XGELL_RX_PKT_BURST		32
1148347601bSyl 
115a23fd118Syl /* About 1s */
116a23fd118Syl #define	XGE_DEV_POLL_TICKS drv_usectohz(1000000)
117a23fd118Syl 
1188347601bSyl #define	XGELL_LSO_MAXLEN			65535
1198347601bSyl #define	XGELL_CONF_ENABLE_BY_DEFAULT		1
1208347601bSyl #define	XGELL_CONF_DISABLE_BY_DEFAULT		0
1218347601bSyl 
1228347601bSyl /* LRO configuration */
123*7eced415Sxw #define	XGE_HAL_DEFAULT_LRO_SG_SIZE		2 /* <=2 LRO fix not required */
1248347601bSyl #define	XGE_HAL_DEFAULT_LRO_FRM_LEN		65535
1258347601bSyl 
126a23fd118Syl /*
127*7eced415Sxw  * Default values for tunables used in HAL. Please refer to xgehal-config.h
128*7eced415Sxw  * for more details.
129a23fd118Syl  */
130a23fd118Syl #define	XGE_HAL_DEFAULT_USE_HARDCODE		-1
131a23fd118Syl 
132*7eced415Sxw /* Bimodal adaptive schema defaults - ENABLED */
1338347601bSyl #define	XGE_HAL_DEFAULT_BIMODAL_INTERRUPTS	-1
1348347601bSyl #define	XGE_HAL_DEFAULT_BIMODAL_TIMER_LO_US	24
1358347601bSyl #define	XGE_HAL_DEFAULT_BIMODAL_TIMER_HI_US	256
1368347601bSyl 
137*7eced415Sxw /* Interrupt moderation/utilization defaults */
1388347601bSyl #define	XGE_HAL_DEFAULT_TX_URANGE_A		5
1398347601bSyl #define	XGE_HAL_DEFAULT_TX_URANGE_B		15
1408347601bSyl #define	XGE_HAL_DEFAULT_TX_URANGE_C		30
1418347601bSyl #define	XGE_HAL_DEFAULT_TX_UFC_A		15
1428347601bSyl #define	XGE_HAL_DEFAULT_TX_UFC_B		30
1438347601bSyl #define	XGE_HAL_DEFAULT_TX_UFC_C		45
1448347601bSyl #define	XGE_HAL_DEFAULT_TX_UFC_D		60
145a23fd118Syl #define	XGE_HAL_DEFAULT_TX_TIMER_CI_EN		1
146a23fd118Syl #define	XGE_HAL_DEFAULT_TX_TIMER_AC_EN		1
1478347601bSyl #define	XGE_HAL_DEFAULT_TX_TIMER_VAL		10000
1488347601bSyl #define	XGE_HAL_DEFAULT_INDICATE_MAX_PKTS_B	512 /* bimodal */
1498347601bSyl #define	XGE_HAL_DEFAULT_INDICATE_MAX_PKTS_N	256 /* normal UFC */
150a23fd118Syl #define	XGE_HAL_DEFAULT_RX_URANGE_A		10
1518347601bSyl #define	XGE_HAL_DEFAULT_RX_URANGE_B		30
152a23fd118Syl #define	XGE_HAL_DEFAULT_RX_URANGE_C		50
1538347601bSyl #define	XGE_HAL_DEFAULT_RX_UFC_A		1
1548347601bSyl #define	XGE_HAL_DEFAULT_RX_UFC_B_J		2
1558347601bSyl #define	XGE_HAL_DEFAULT_RX_UFC_B_N		8
1568347601bSyl #define	XGE_HAL_DEFAULT_RX_UFC_C_J		4
1578347601bSyl #define	XGE_HAL_DEFAULT_RX_UFC_C_N		16
1588347601bSyl #define	XGE_HAL_DEFAULT_RX_UFC_D		32
159a23fd118Syl #define	XGE_HAL_DEFAULT_RX_TIMER_AC_EN		1
1608347601bSyl #define	XGE_HAL_DEFAULT_RX_TIMER_VAL		384
161a23fd118Syl 
162a23fd118Syl #define	XGE_HAL_DEFAULT_FIFO_QUEUE_LENGTH_J	2048
163a23fd118Syl #define	XGE_HAL_DEFAULT_FIFO_QUEUE_LENGTH_N	4096
164a23fd118Syl #define	XGE_HAL_DEFAULT_FIFO_QUEUE_INTR		0
165a23fd118Syl #define	XGE_HAL_DEFAULT_FIFO_RESERVE_THRESHOLD	0
166a23fd118Syl #define	XGE_HAL_DEFAULT_FIFO_MEMBLOCK_SIZE	PAGESIZE
167a23fd118Syl 
1688347601bSyl /*
169*7eced415Sxw  * This will force HAL to allocate extra copied buffer per TXDL which
1708347601bSyl  * size calculated by formula:
1718347601bSyl  *
1728347601bSyl  *      (ALIGNMENT_SIZE * ALIGNED_FRAGS)
1738347601bSyl  */
1748347601bSyl #define	XGE_HAL_DEFAULT_FIFO_ALIGNMENT_SIZE	4096
175a23fd118Syl #define	XGE_HAL_DEFAULT_FIFO_MAX_ALIGNED_FRAGS	1
176a23fd118Syl #if defined(__x86)
1778347601bSyl #define	XGE_HAL_DEFAULT_FIFO_FRAGS		128
178a23fd118Syl #else
1798347601bSyl #define	XGE_HAL_DEFAULT_FIFO_FRAGS		64
180a23fd118Syl #endif
1818347601bSyl #define	XGE_HAL_DEFAULT_FIFO_FRAGS_THRESHOLD	18
182a23fd118Syl 
1838347601bSyl #define	XGE_HAL_DEFAULT_RING_QUEUE_BLOCKS_J	2
1848347601bSyl #define	XGE_HAL_DEFAULT_RING_QUEUE_BLOCKS_N	2
185a23fd118Syl #define	XGE_HAL_RING_QUEUE_BUFFER_MODE_DEFAULT	1
1868347601bSyl #define	XGE_HAL_DEFAULT_BACKOFF_INTERVAL_US	64
187a23fd118Syl #define	XGE_HAL_DEFAULT_RING_PRIORITY		0
188a23fd118Syl #define	XGE_HAL_DEFAULT_RING_MEMBLOCK_SIZE	PAGESIZE
189a23fd118Syl 
190a23fd118Syl #define	XGE_HAL_DEFAULT_RING_NUM		8
191a23fd118Syl #define	XGE_HAL_DEFAULT_TMAC_UTIL_PERIOD	5
192a23fd118Syl #define	XGE_HAL_DEFAULT_RMAC_UTIL_PERIOD	5
193a23fd118Syl #define	XGE_HAL_DEFAULT_RMAC_HIGH_PTIME		65535
194a23fd118Syl #define	XGE_HAL_DEFAULT_MC_PAUSE_THRESHOLD_Q0Q3	187
195a23fd118Syl #define	XGE_HAL_DEFAULT_MC_PAUSE_THRESHOLD_Q4Q7	187
1968347601bSyl #define	XGE_HAL_DEFAULT_RMAC_PAUSE_GEN_EN	1
1978347601bSyl #define	XGE_HAL_DEFAULT_RMAC_PAUSE_GEN_DIS	0
1988347601bSyl #define	XGE_HAL_DEFAULT_RMAC_PAUSE_RCV_EN	1
1998347601bSyl #define	XGE_HAL_DEFAULT_RMAC_PAUSE_RCV_DIS	0
200a23fd118Syl #define	XGE_HAL_DEFAULT_INITIAL_MTU		XGE_HAL_DEFAULT_MTU /* 1500 */
2018347601bSyl #define	XGE_HAL_DEFAULT_ISR_POLLING_CNT		0
202a23fd118Syl #define	XGE_HAL_DEFAULT_LATENCY_TIMER		255
203*7eced415Sxw #define	XGE_HAL_DEFAULT_SHARED_SPLITS		0
204a23fd118Syl #define	XGE_HAL_DEFAULT_STATS_REFRESH_TIME	1
205a23fd118Syl 
206*7eced415Sxw #if defined(__sparc)
207*7eced415Sxw #define	XGE_HAL_DEFAULT_MMRB_COUNT		\
208*7eced415Sxw 		XGE_HAL_MAX_MMRB_COUNT
209*7eced415Sxw #define	XGE_HAL_DEFAULT_SPLIT_TRANSACTION	\
210*7eced415Sxw 		XGE_HAL_EIGHT_SPLIT_TRANSACTION
211*7eced415Sxw #else
212*7eced415Sxw #define	XGE_HAL_DEFAULT_MMRB_COUNT		1 /* 1k */
213*7eced415Sxw #define	XGE_HAL_DEFAULT_SPLIT_TRANSACTION	\
214*7eced415Sxw 		XGE_HAL_TWO_SPLIT_TRANSACTION
215*7eced415Sxw #endif
216*7eced415Sxw 
217a23fd118Syl /*
218a23fd118Syl  * default the size of buffers allocated for ndd interface functions
219a23fd118Syl  */
220*7eced415Sxw #define	XGELL_STATS_BUFSIZE			8192
221a23fd118Syl #define	XGELL_PCICONF_BUFSIZE			2048
222a23fd118Syl #define	XGELL_ABOUT_BUFSIZE			512
223a23fd118Syl #define	XGELL_IOCTL_BUFSIZE			64
224*7eced415Sxw #define	XGELL_DEVCONF_BUFSIZE			8192
225a23fd118Syl 
226a23fd118Syl /*
227a23fd118Syl  * xgell_event_e
228a23fd118Syl  *
229a23fd118Syl  * This enumeration derived from xgehal_event_e. It extends it
230a23fd118Syl  * for the reason to get serialized context.
231a23fd118Syl  */
232a23fd118Syl /* Renamb the macro from HAL */
233a23fd118Syl #define	XGELL_EVENT_BASE	XGE_LL_EVENT_BASE
234a23fd118Syl typedef enum xgell_event_e {
235a23fd118Syl 	/* LL events */
236a23fd118Syl 	XGELL_EVENT_RESCHED_NEEDED	= XGELL_EVENT_BASE + 1,
237a23fd118Syl } xgell_event_e;
238a23fd118Syl 
239a23fd118Syl typedef struct {
2408347601bSyl 	int rx_pkt_burst;
241a23fd118Syl 	int rx_buffer_total;
242a23fd118Syl 	int rx_buffer_post_hiwat;
2438347601bSyl 	int rx_dma_lowat;
2448347601bSyl 	int tx_dma_lowat;
245*7eced415Sxw 	int msix_enable;
2468347601bSyl 	int lso_enable;
247a23fd118Syl } xgell_config_t;
248a23fd118Syl 
249*7eced415Sxw typedef struct xgell_ring xgell_ring_t;
250*7eced415Sxw typedef struct xgell_fifo xgell_fifo_t;
251*7eced415Sxw 
252a23fd118Syl typedef struct xgell_rx_buffer_t {
253a23fd118Syl 	struct xgell_rx_buffer_t	*next;
254a23fd118Syl 	void				*vaddr;
255a23fd118Syl 	dma_addr_t			dma_addr;
256a23fd118Syl 	ddi_dma_handle_t		dma_handle;
257a23fd118Syl 	ddi_acc_handle_t		dma_acch;
258*7eced415Sxw 	xgell_ring_t			*ring;
259a23fd118Syl 	frtn_t				frtn;
260a23fd118Syl } xgell_rx_buffer_t;
261a23fd118Syl 
262a23fd118Syl /* Buffer pool for all rings */
263a23fd118Syl typedef struct xgell_rx_buffer_pool_t {
264a23fd118Syl 	uint_t			total;		/* total buffers */
265a23fd118Syl 	uint_t			size;		/* buffer size */
266a23fd118Syl 	xgell_rx_buffer_t	*head;		/* header pointer */
267a23fd118Syl 	uint_t			free;		/* free buffers */
268a23fd118Syl 	uint_t			post;		/* posted buffers */
269a23fd118Syl 	uint_t			post_hiwat;	/* hiwat to stop post */
270a23fd118Syl 	spinlock_t		pool_lock;	/* buffer pool lock */
271*7eced415Sxw 	xgell_rx_buffer_t	*recycle_head;	/* recycle list's head */
272*7eced415Sxw 	xgell_rx_buffer_t	*recycle_tail;	/* recycle list's tail */
273*7eced415Sxw 	uint_t			recycle;	/* # of rx buffers recycled */
274*7eced415Sxw 	spinlock_t		recycle_lock;	/* buffer recycle lock */
275a23fd118Syl } xgell_rx_buffer_pool_t;
276a23fd118Syl 
277ba2e4443Sseb typedef struct xgelldev xgelldev_t;
278ba2e4443Sseb 
279*7eced415Sxw struct xgell_ring {
280a23fd118Syl 	xge_hal_channel_h	channelh;
281ba2e4443Sseb 	xgelldev_t		*lldev;
282a23fd118Syl 	mac_resource_handle_t	handle;		/* per ring cookie */
283*7eced415Sxw 	xgell_rx_buffer_pool_t	bf_pool;
284*7eced415Sxw };
285*7eced415Sxw 
286*7eced415Sxw struct xgell_fifo {
287*7eced415Sxw 	xge_hal_channel_h	channelh;
288*7eced415Sxw 	xgelldev_t		*lldev;
289*7eced415Sxw 	int			level_low;
290*7eced415Sxw };
291a23fd118Syl 
292ba2e4443Sseb struct xgelldev {
293a23fd118Syl 	caddr_t			ndp;
294ba2e4443Sseb 	mac_handle_t		mh;
295a23fd118Syl 	int			instance;
296a23fd118Syl 	dev_info_t		*dev_info;
297a23fd118Syl 	xge_hal_device_h	devh;
298*7eced415Sxw 	xgell_ring_t		rings[XGE_HAL_MAX_RING_NUM];
299*7eced415Sxw 	xgell_fifo_t		fifos[XGE_HAL_MAX_FIFO_NUM];
300a23fd118Syl 	int			resched_avail;
301a23fd118Syl 	int			resched_send;
302a23fd118Syl 	int			resched_retry;
3038347601bSyl 	int			tx_copied_max;
304a23fd118Syl 	volatile int		is_initialized;
305a23fd118Syl 	xgell_config_t		config;
306a23fd118Syl 	volatile int		in_reset;
307a23fd118Syl 	timeout_id_t		timeout_id;
308a23fd118Syl 	kmutex_t		genlock;
309*7eced415Sxw 	ddi_intr_handle_t	*intr_table;
310*7eced415Sxw 	uint_t			intr_table_size;
311*7eced415Sxw 	int			intr_type;
312*7eced415Sxw 	int			intr_cnt;
313*7eced415Sxw 	uint_t			intr_pri;
314*7eced415Sxw 	int			intr_cap;
315ba2e4443Sseb };
316a23fd118Syl 
317a23fd118Syl typedef struct {
318a23fd118Syl 	mblk_t			*mblk;
319a23fd118Syl 	ddi_dma_handle_t	dma_handles[XGE_HAL_DEFAULT_FIFO_FRAGS];
320a23fd118Syl 	int			handle_cnt;
321a23fd118Syl } xgell_txd_priv_t;
322a23fd118Syl 
323a23fd118Syl typedef struct {
324a23fd118Syl 	xgell_rx_buffer_t	*rx_buffer;
325a23fd118Syl } xgell_rxd_priv_t;
326a23fd118Syl 
327a23fd118Syl int xgell_device_alloc(xge_hal_device_h devh, dev_info_t *dev_info,
328a23fd118Syl     xgelldev_t **lldev_out);
329a23fd118Syl 
330a23fd118Syl void xgell_device_free(xgelldev_t *lldev);
331a23fd118Syl 
332a23fd118Syl int xgell_device_register(xgelldev_t *lldev, xgell_config_t *config);
333a23fd118Syl 
334a23fd118Syl int xgell_device_unregister(xgelldev_t *lldev);
335a23fd118Syl 
336a23fd118Syl void xgell_callback_link_up(void *userdata);
337a23fd118Syl 
338a23fd118Syl void xgell_callback_link_down(void *userdata);
339a23fd118Syl 
340a23fd118Syl int xgell_onerr_reset(xgelldev_t *lldev);
341a23fd118Syl 
342a23fd118Syl void xge_device_poll_now(void *data);
343a23fd118Syl 
344*7eced415Sxw int xge_add_intrs(xgelldev_t *lldev);
345*7eced415Sxw 
346*7eced415Sxw int xge_enable_intrs(xgelldev_t *lldev);
347*7eced415Sxw 
348*7eced415Sxw void xge_disable_intrs(xgelldev_t *lldev);
349*7eced415Sxw 
350*7eced415Sxw void xge_rem_intrs(xgelldev_t *lldev);
351*7eced415Sxw 
352*7eced415Sxw 
353*7eced415Sxw 
354*7eced415Sxw 
355a23fd118Syl #ifdef __cplusplus
356a23fd118Syl }
357a23fd118Syl #endif
358a23fd118Syl 
359a23fd118Syl #endif /* _SYS_XGELL_H */
360