xref: /onnv-gate/usr/src/uts/sun4v/sys/vsw_ldc.h (revision 13098:496fd9979cfc)
15373Sraghuram /*
25373Sraghuram  * CDDL HEADER START
35373Sraghuram  *
45373Sraghuram  * The contents of this file are subject to the terms of the
55373Sraghuram  * Common Development and Distribution License (the "License").
65373Sraghuram  * You may not use this file except in compliance with the License.
75373Sraghuram  *
85373Sraghuram  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95373Sraghuram  * or http://www.opensolaris.org/os/licensing.
105373Sraghuram  * See the License for the specific language governing permissions
115373Sraghuram  * and limitations under the License.
125373Sraghuram  *
135373Sraghuram  * When distributing Covered Code, include this CDDL HEADER in each
145373Sraghuram  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155373Sraghuram  * If applicable, add the following below this CDDL HEADER, with the
165373Sraghuram  * fields enclosed by brackets "[]" replaced with your own identifying
175373Sraghuram  * information: Portions Copyright [yyyy] [name of copyright owner]
185373Sraghuram  *
195373Sraghuram  * CDDL HEADER END
205373Sraghuram  */
215373Sraghuram 
225373Sraghuram /*
2312950SWentao.Yang@Sun.COM  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
245373Sraghuram  */
255373Sraghuram 
265373Sraghuram /*
275373Sraghuram  * This header file contains the basic data structures which the
285373Sraghuram  * virtual switch (vsw) uses to communicate with vnet clients.
295373Sraghuram  *
305373Sraghuram  * The virtual switch reads the machine description (MD) to
315373Sraghuram  * determine how many port_t structures to create (each port_t
325373Sraghuram  * can support communications to a single network device). The
335373Sraghuram  * port_t's are maintained in a linked list.
345373Sraghuram  *
355373Sraghuram  * Each port in turn contains a number of logical domain channels
365373Sraghuram  * (ldc's) which are inter domain communications channels which
3712011SSriharsha.Basavapatna@Sun.COM  * are used for passing small messages between the domains. There
3812011SSriharsha.Basavapatna@Sun.COM  * may be any number of channels associated with each port, though
3912011SSriharsha.Basavapatna@Sun.COM  * currently most devices only have a single channel. The current
4012011SSriharsha.Basavapatna@Sun.COM  * implementation provides support for only one channel per port.
415373Sraghuram  *
425373Sraghuram  * The ldc is a bi-directional channel, which is divided up into
435373Sraghuram  * two directional 'lanes', one outbound from the switch to the
445373Sraghuram  * virtual network device, the other inbound to the switch.
455373Sraghuram  * Depending on the type of device each lane may have seperate
465373Sraghuram  * communication paramaters (such as mtu etc).
475373Sraghuram  *
485373Sraghuram  * For those network clients which use descriptor rings the
495373Sraghuram  * rings are associated with the appropriate lane. I.e. rings
505373Sraghuram  * which the switch exports are associated with the outbound lanes
515373Sraghuram  * while those which the network clients are exporting to the switch
525373Sraghuram  * are associated with the inbound lane.
535373Sraghuram  *
545373Sraghuram  * In diagram form the data structures look as follows:
555373Sraghuram  *
565373Sraghuram  * vsw instance
575373Sraghuram  *     |
585373Sraghuram  *     +----->port_t----->port_t----->port_t----->
595373Sraghuram  *		|
6012011SSriharsha.Basavapatna@Sun.COM  *		+--->ldc_t
615373Sraghuram  *		       |
625373Sraghuram  *		       +--->lane_t (inbound)
635373Sraghuram  *		       |       |
6412011SSriharsha.Basavapatna@Sun.COM  *		       |       +--->dring
655373Sraghuram  *		       |
665373Sraghuram  *		       +--->lane_t (outbound)
675373Sraghuram  *			       |
6812011SSriharsha.Basavapatna@Sun.COM  *			       +--->dring
695373Sraghuram  *
705373Sraghuram  */
715373Sraghuram 
725373Sraghuram #ifndef	_VSW_LDC_H
735373Sraghuram #define	_VSW_LDC_H
745373Sraghuram 
755373Sraghuram #ifdef	__cplusplus
765373Sraghuram extern "C" {
775373Sraghuram #endif
785373Sraghuram 
795373Sraghuram /*
8012011SSriharsha.Basavapatna@Sun.COM  * LDC pkt tranfer MTU - largest msg size used
8112011SSriharsha.Basavapatna@Sun.COM  */
8212011SSriharsha.Basavapatna@Sun.COM #define	VSW_LDC_MTU		64
8312011SSriharsha.Basavapatna@Sun.COM 
8412011SSriharsha.Basavapatna@Sun.COM #define	VSW_DEF_MSG_WORDS	\
8512011SSriharsha.Basavapatna@Sun.COM 	(VNET_DRING_REG_EXT_MSG_SIZE_MAX / sizeof (uint64_t))
8612011SSriharsha.Basavapatna@Sun.COM 
8712011SSriharsha.Basavapatna@Sun.COM /*
885373Sraghuram  * Default message type.
895373Sraghuram  */
905373Sraghuram typedef struct def_msg {
9112011SSriharsha.Basavapatna@Sun.COM 	uint64_t	data[VSW_DEF_MSG_WORDS];
925373Sraghuram } def_msg_t;
935373Sraghuram 
945373Sraghuram /*
955373Sraghuram  * Currently only support one major/minor pair.
965373Sraghuram  */
975373Sraghuram #define	VSW_NUM_VER	1
985373Sraghuram 
995373Sraghuram typedef struct ver_sup {
1005462Swentaoy 	uint16_t	ver_major;	/* major version number */
1015462Swentaoy 	uint16_t	ver_minor;	/* minor version number */
1025373Sraghuram } ver_sup_t;
1035373Sraghuram 
1045373Sraghuram /*
1055373Sraghuram  * Lane states.
1065373Sraghuram  */
1075373Sraghuram #define	VSW_LANE_INACTIV	0x0	/* No params set for lane */
1085373Sraghuram 
1095373Sraghuram #define	VSW_VER_INFO_SENT	0x1	/* Version # sent to peer */
1105373Sraghuram #define	VSW_VER_INFO_RECV	0x2	/* Version # recv from peer */
1115373Sraghuram #define	VSW_VER_ACK_RECV	0x4
1125373Sraghuram #define	VSW_VER_ACK_SENT	0x8
1135373Sraghuram #define	VSW_VER_NACK_RECV	0x10
1145373Sraghuram #define	VSW_VER_NACK_SENT	0x20
1155373Sraghuram 
1165373Sraghuram #define	VSW_ATTR_INFO_SENT	0x40	/* Attributes sent to peer */
1175373Sraghuram #define	VSW_ATTR_INFO_RECV	0x80	/* Peer attributes received */
1185373Sraghuram #define	VSW_ATTR_ACK_SENT	0x100
1195373Sraghuram #define	VSW_ATTR_ACK_RECV	0x200
1205373Sraghuram #define	VSW_ATTR_NACK_SENT	0x400
1215373Sraghuram #define	VSW_ATTR_NACK_RECV	0x800
1225373Sraghuram 
1235373Sraghuram #define	VSW_DRING_INFO_SENT	0x1000	/* Dring info sent to peer */
1245373Sraghuram #define	VSW_DRING_INFO_RECV	0x2000	/* Dring info received */
1255373Sraghuram #define	VSW_DRING_ACK_SENT	0x4000
1265373Sraghuram #define	VSW_DRING_ACK_RECV	0x8000
1275373Sraghuram #define	VSW_DRING_NACK_SENT	0x10000
1285373Sraghuram #define	VSW_DRING_NACK_RECV	0x20000
1295373Sraghuram 
1305373Sraghuram #define	VSW_RDX_INFO_SENT	0x40000	/* RDX sent to peer */
1315373Sraghuram #define	VSW_RDX_INFO_RECV	0x80000	/* RDX received from peer */
1325373Sraghuram #define	VSW_RDX_ACK_SENT	0x100000
1335373Sraghuram #define	VSW_RDX_ACK_RECV	0x200000
1345373Sraghuram #define	VSW_RDX_NACK_SENT	0x400000
1355373Sraghuram #define	VSW_RDX_NACK_RECV	0x800000
1365373Sraghuram 
1375373Sraghuram #define	VSW_MCST_INFO_SENT	0x1000000
1385373Sraghuram #define	VSW_MCST_INFO_RECV	0x2000000
1395373Sraghuram #define	VSW_MCST_ACK_SENT	0x4000000
1405373Sraghuram #define	VSW_MCST_ACK_RECV	0x8000000
1415373Sraghuram #define	VSW_MCST_NACK_SENT	0x10000000
1425373Sraghuram #define	VSW_MCST_NACK_RECV	0x20000000
1435373Sraghuram 
1445373Sraghuram #define	VSW_LANE_ACTIVE		0x40000000	/* Lane open to xmit data */
1455373Sraghuram 
1465373Sraghuram /* Handshake milestones */
1475373Sraghuram #define	VSW_MILESTONE0		0x1	/* ver info exchanged */
1485373Sraghuram #define	VSW_MILESTONE1		0x2	/* attribute exchanged */
1495373Sraghuram #define	VSW_MILESTONE2		0x4	/* dring info exchanged */
1505373Sraghuram #define	VSW_MILESTONE3		0x8	/* rdx exchanged */
1515373Sraghuram #define	VSW_MILESTONE4		0x10	/* handshake complete */
1525373Sraghuram 
1535373Sraghuram /*
1545373Sraghuram  * Lane direction (relative to ourselves).
1555373Sraghuram  */
1565373Sraghuram #define	INBOUND			0x1
1575373Sraghuram #define	OUTBOUND		0x2
1585373Sraghuram 
1595373Sraghuram /* Peer session id received */
1605373Sraghuram #define	VSW_PEER_SESSION	0x1
1615373Sraghuram 
1625373Sraghuram /*
1635373Sraghuram  * Maximum number of consecutive reads of data from channel
1645373Sraghuram  */
1655373Sraghuram #define	VSW_MAX_CHAN_READ	50
1665373Sraghuram 
1675373Sraghuram /*
1685373Sraghuram  * Currently only support one ldc per port.
1695373Sraghuram  */
1705373Sraghuram #define	VSW_PORT_MAX_LDCS	1	/* max # of ldcs per port */
1715373Sraghuram 
1725373Sraghuram /*
1735373Sraghuram  * Used for port add/deletion.
1745373Sraghuram  */
1755373Sraghuram #define	VSW_PORT_UPDATED	0x1
1765373Sraghuram 
1775373Sraghuram #define	LDC_TX_SUCCESS		0	/* ldc transmit success */
1785373Sraghuram #define	LDC_TX_FAILURE		1	/* ldc transmit failure */
1795373Sraghuram #define	LDC_TX_NORESOURCES	2	/* out of descriptors */
1805373Sraghuram 
1815373Sraghuram /*
1825373Sraghuram  * Descriptor ring info
1835373Sraghuram  *
1845373Sraghuram  * Each descriptor element has a pre-allocated data buffer
1855373Sraghuram  * associated with it, into which data being transmitted is
1865373Sraghuram  * copied. By pre-allocating we speed up the copying process.
1875373Sraghuram  * The buffer is re-used once the peer has indicated that it is
1885373Sraghuram  * finished with the descriptor.
1895373Sraghuram  */
1905373Sraghuram #define	VSW_RING_EL_DATA_SZ	2048	/* Size of data section (bytes) */
1915373Sraghuram #define	VSW_PRIV_SIZE	sizeof (vnet_private_desc_t)
1925373Sraghuram 
1935373Sraghuram #define	VSW_MAX_COOKIES		((ETHERMTU >> MMU_PAGESHIFT) + 2)
1945373Sraghuram 
1955373Sraghuram /*
1965373Sraghuram  * Size of the mblk in each mblk pool.
1975373Sraghuram  */
1985373Sraghuram #define	VSW_MBLK_SZ_128		128
1995373Sraghuram #define	VSW_MBLK_SZ_256		256
2005373Sraghuram #define	VSW_MBLK_SZ_2048	2048
2015373Sraghuram 
2025373Sraghuram /*
2035373Sraghuram  * Number of mblks in each mblk pool.
2045373Sraghuram  */
2055373Sraghuram #define	VSW_NUM_MBLKS	1024
2065373Sraghuram 
207*13098SWentao.Yang@Sun.COM /*
208*13098SWentao.Yang@Sun.COM  * Number of rcv buffers in RxDringData mode
209*13098SWentao.Yang@Sun.COM  */
210*13098SWentao.Yang@Sun.COM #define	VSW_RXDRING_NRBUFS	(vsw_num_descriptors * vsw_nrbufs_factor)
211*13098SWentao.Yang@Sun.COM 
21212011SSriharsha.Basavapatna@Sun.COM /* increment recv index */
21312011SSriharsha.Basavapatna@Sun.COM #define	INCR_DESC_INDEX(dp, i)	\
21412011SSriharsha.Basavapatna@Sun.COM 		((i) = (((i) + 1) & ((dp)->num_descriptors - 1)))
21512011SSriharsha.Basavapatna@Sun.COM 
21612011SSriharsha.Basavapatna@Sun.COM /* decrement recv index */
21712011SSriharsha.Basavapatna@Sun.COM #define	DECR_DESC_INDEX(dp, i)	\
21812011SSriharsha.Basavapatna@Sun.COM 		((i) = (((i) - 1) & ((dp)->num_descriptors - 1)))
21912011SSriharsha.Basavapatna@Sun.COM 
22012011SSriharsha.Basavapatna@Sun.COM #define	INCR_TXI	INCR_DESC_INDEX
22112011SSriharsha.Basavapatna@Sun.COM #define	DECR_TXI	DECR_DESC_INDEX
22212011SSriharsha.Basavapatna@Sun.COM #define	INCR_RXI	INCR_DESC_INDEX
22312011SSriharsha.Basavapatna@Sun.COM #define	DECR_RXI	DECR_DESC_INDEX
22412011SSriharsha.Basavapatna@Sun.COM 
22512011SSriharsha.Basavapatna@Sun.COM /* bounds check rx index */
22612011SSriharsha.Basavapatna@Sun.COM #define	CHECK_DESC_INDEX(dp, i)	\
22712011SSriharsha.Basavapatna@Sun.COM 		(((i) >= 0) && ((i) < (dp)->num_descriptors))
22812011SSriharsha.Basavapatna@Sun.COM 
22912011SSriharsha.Basavapatna@Sun.COM #define	CHECK_RXI	CHECK_DESC_INDEX
23012011SSriharsha.Basavapatna@Sun.COM #define	CHECK_TXI	CHECK_DESC_INDEX
23112011SSriharsha.Basavapatna@Sun.COM 
2325373Sraghuram /*
2335373Sraghuram  * Private descriptor
2345373Sraghuram  */
2355373Sraghuram typedef struct vsw_private_desc {
2365373Sraghuram 	/*
2375373Sraghuram 	 * Below lock must be held when accessing the state of
2385373Sraghuram 	 * a descriptor on either the private or public sections
2395373Sraghuram 	 * of the ring.
2405373Sraghuram 	 */
2415373Sraghuram 	kmutex_t		dstate_lock;
2425373Sraghuram 	uint64_t		dstate;
2435373Sraghuram 	vnet_public_desc_t	*descp;
2445373Sraghuram 	ldc_mem_handle_t	memhandle;
2455373Sraghuram 	void			*datap;
2465373Sraghuram 	uint64_t		datalen;
2475373Sraghuram 	uint64_t		ncookies;
2485373Sraghuram 	ldc_mem_cookie_t	memcookie[VSW_MAX_COOKIES];
2495373Sraghuram 	int			bound;
2505373Sraghuram } vsw_private_desc_t;
2515373Sraghuram 
2525373Sraghuram /*
2535373Sraghuram  * Descriptor ring structure
2545373Sraghuram  */
2555373Sraghuram typedef struct dring_info {
25612011SSriharsha.Basavapatna@Sun.COM 	kmutex_t		dlock;		/* sync access */
25712011SSriharsha.Basavapatna@Sun.COM 	uint32_t		num_descriptors; /* # of descriptors */
25812011SSriharsha.Basavapatna@Sun.COM 	uint32_t		descriptor_size; /* size of descriptor */
25912011SSriharsha.Basavapatna@Sun.COM 	uint32_t		options;	/* dring options (mode) */
26012011SSriharsha.Basavapatna@Sun.COM 	ldc_dring_handle_t	dring_handle;	/* dring LDC handle */
26112011SSriharsha.Basavapatna@Sun.COM 	uint32_t		dring_ncookies;	/* # of dring cookies */
26212011SSriharsha.Basavapatna@Sun.COM 	ldc_mem_cookie_t	dring_cookie[1]; /* LDC cookie of dring */
26312011SSriharsha.Basavapatna@Sun.COM 	ldc_mem_handle_t	data_handle;	/* data area  LDC handle */
26412011SSriharsha.Basavapatna@Sun.COM 	uint32_t		data_ncookies;	/* # of data area cookies */
26512011SSriharsha.Basavapatna@Sun.COM 	ldc_mem_cookie_t	*data_cookie;	/* data area LDC cookies */
26612011SSriharsha.Basavapatna@Sun.COM 	uint64_t		ident;		/* identifier sent to peer */
2675373Sraghuram 	uint64_t		end_idx;	/* last idx processed */
26812011SSriharsha.Basavapatna@Sun.COM 	int64_t			last_ack_recv;	/* last ack received */
26912011SSriharsha.Basavapatna@Sun.COM 	kmutex_t		txlock;		/* protect tx desc alloc */
27012011SSriharsha.Basavapatna@Sun.COM 	uint32_t		next_txi;	/* next tx descriptor index */
27112011SSriharsha.Basavapatna@Sun.COM 	uint32_t		next_rxi;	/* next expected recv index */
27212011SSriharsha.Basavapatna@Sun.COM 	kmutex_t		restart_lock;	/* protect restart_reqd */
2735373Sraghuram 	boolean_t		restart_reqd;	/* send restart msg */
27412950SWentao.Yang@Sun.COM 	uint32_t		restart_peer_txi; /* index to restart peer */
2755373Sraghuram 	void			*pub_addr;	/* base of public section */
2765373Sraghuram 	void			*priv_addr;	/* base of private section */
2775373Sraghuram 	void			*data_addr;	/* base of data section */
2785373Sraghuram 	size_t			data_sz;	/* size of data section */
2796419Ssb155480 	size_t			desc_data_sz;	/* size of descr data blk */
2806845Sha137994 	uint8_t			dring_mtype;	/* dring mem map type */
28112011SSriharsha.Basavapatna@Sun.COM 	uint32_t		num_bufs;	/* # of buffers */
28212011SSriharsha.Basavapatna@Sun.COM 	vio_mblk_pool_t		*rx_vmp;	/* rx mblk pool */
28312011SSriharsha.Basavapatna@Sun.COM 	vio_mblk_t		**rxdp_to_vmp;	/* descr to buf map tbl */
2845373Sraghuram } dring_info_t;
2855373Sraghuram 
2865373Sraghuram /*
2875373Sraghuram  * Each ldc connection is comprised of two lanes, incoming
2885373Sraghuram  * from a peer, and outgoing to that peer. Each lane shares
2895373Sraghuram  * common ldc parameters and also has private lane-specific
2905373Sraghuram  * parameters.
2915373Sraghuram  */
2925373Sraghuram typedef struct lane {
2935373Sraghuram 	uint64_t	lstate;		/* Lane state */
2945462Swentaoy 	uint16_t	ver_major;	/* Version major number */
2955462Swentaoy 	uint16_t	ver_minor;	/* Version minor number */
2965373Sraghuram 	uint64_t	seq_num;	/* Sequence number */
2975373Sraghuram 	uint64_t	mtu;		/* ETHERMTU */
2985373Sraghuram 	uint64_t	addr;		/* Unique physical address */
2995373Sraghuram 	uint8_t		addr_type;	/* Only MAC address at moment */
3005373Sraghuram 	uint8_t		xfer_mode;	/* Dring or Pkt based */
3015373Sraghuram 	uint8_t		ack_freq;	/* Only non zero for Pkt based xfer */
3029336SSriharsha.Basavapatna@Sun.COM 	uint32_t	physlink_update;	/* physlink updates */
30312011SSriharsha.Basavapatna@Sun.COM 	uint8_t		dring_mode;	/* Descriptor ring mode */
3045373Sraghuram 	dring_info_t	*dringp;	/* List of drings for this lane */
3055373Sraghuram } lane_t;
3065373Sraghuram 
3075373Sraghuram /* channel drain states */
3085373Sraghuram #define	VSW_LDC_INIT		0x1	/* Initial non-drain state */
3095373Sraghuram #define	VSW_LDC_DRAINING	0x2	/* Channel draining */
3105373Sraghuram 
3115935Ssb155480 /*
3125935Ssb155480  * vnet-protocol-version dependent function prototypes.
3135935Ssb155480  */
3145935Ssb155480 typedef int	(*vsw_ldctx_t) (void *, mblk_t *, mblk_t *, uint32_t);
3155935Ssb155480 typedef void	(*vsw_ldcrx_pktdata_t) (void *, void *, uint32_t);
31612011SSriharsha.Basavapatna@Sun.COM typedef void	(*vsw_ldcrx_dringdata_t) (void *, void *);
3175935Ssb155480 
3185373Sraghuram /* ldc information associated with a vsw-port */
3195373Sraghuram typedef struct vsw_ldc {
3205373Sraghuram 	struct vsw_ldc		*ldc_next;	/* next ldc in the list */
3215373Sraghuram 	struct vsw_port		*ldc_port;	/* associated port */
3225373Sraghuram 	struct vsw		*ldc_vswp;	/* associated vsw */
3235373Sraghuram 	kmutex_t		ldc_cblock;	/* sync callback processing */
3245373Sraghuram 	kmutex_t		ldc_txlock;	/* sync transmits */
3255373Sraghuram 	kmutex_t		ldc_rxlock;	/* sync rx */
3265373Sraghuram 	uint64_t		ldc_id;		/* channel number */
3275373Sraghuram 	ldc_handle_t		ldc_handle;	/* channel handle */
3285373Sraghuram 	kmutex_t		drain_cv_lock;
3295373Sraghuram 	kcondvar_t		drain_cv;	/* channel draining */
3305373Sraghuram 	int			drain_state;
3315373Sraghuram 	uint32_t		hphase;		/* handshake phase */
3325373Sraghuram 	int			hcnt;		/* # handshake attempts */
3335373Sraghuram 	kmutex_t		status_lock;
3345373Sraghuram 	ldc_status_t		ldc_status;	/* channel status */
3355373Sraghuram 	uint8_t			reset_active;	/* reset flag */
3365373Sraghuram 	uint64_t		local_session;	/* Our session id */
3375373Sraghuram 	uint64_t		peer_session;	/* Our peers session id */
3385373Sraghuram 	uint8_t			session_status;	/* Session recv'd, sent */
3395373Sraghuram 	uint32_t		hss_id;		/* Handshake session id */
3405373Sraghuram 	uint64_t		next_ident;	/* Next dring ident # to use */
3415373Sraghuram 	lane_t			lane_in;	/* Inbound lane */
3425373Sraghuram 	lane_t			lane_out;	/* Outbound lane */
3435373Sraghuram 	uint8_t			dev_class;	/* Peer device class */
3449336SSriharsha.Basavapatna@Sun.COM 	boolean_t		pls_negotiated;	/* phys link state update ? */
3455373Sraghuram 	vio_multi_pool_t	vmp;		/* Receive mblk pools */
3467529SSriharsha.Basavapatna@Sun.COM 	uint32_t		max_rxpool_size; /* max size of rxpool in use */
3475935Ssb155480 	uint64_t		*ldcmsg;	/* msg buffer for ldc_read() */
3485935Ssb155480 	uint64_t		msglen;		/* size of ldcmsg */
34912011SSriharsha.Basavapatna@Sun.COM 	uint32_t		dringdata_msgid; /* msgid in RxDringData mode */
3505373Sraghuram 
3515373Sraghuram 	/* tx thread fields */
3525373Sraghuram 	kthread_t		*tx_thread;	/* tx thread */
3535373Sraghuram 	uint32_t		tx_thr_flags;	/* tx thread flags */
3545373Sraghuram 	kmutex_t		tx_thr_lock;	/* lock for tx thread */
3555373Sraghuram 	kcondvar_t		tx_thr_cv;	/* cond.var for tx thread */
3565373Sraghuram 	mblk_t			*tx_mhead;	/* tx mblks head */
3575373Sraghuram 	mblk_t			*tx_mtail;	/* tx mblks tail */
3585935Ssb155480 	uint32_t		tx_cnt;		/* # of pkts queued for tx */
3595373Sraghuram 
36012011SSriharsha.Basavapatna@Sun.COM 	/* message thread fields */
36112011SSriharsha.Basavapatna@Sun.COM 	kthread_t		*msg_thread;	/* message thread */
36212011SSriharsha.Basavapatna@Sun.COM 	uint32_t		msg_thr_flags;	/* message thread flags */
36312011SSriharsha.Basavapatna@Sun.COM 	kmutex_t		msg_thr_lock;	/* lock for message thread */
36412011SSriharsha.Basavapatna@Sun.COM 	kcondvar_t		msg_thr_cv;	/* cond.var for msg thread */
36512011SSriharsha.Basavapatna@Sun.COM 
3665373Sraghuram 	/* receive thread fields */
36712011SSriharsha.Basavapatna@Sun.COM 	kthread_t		*rcv_thread;	/* receive thread */
36812011SSriharsha.Basavapatna@Sun.COM 	uint32_t		rcv_thr_flags;	/* receive thread flags */
36912011SSriharsha.Basavapatna@Sun.COM 	kmutex_t		rcv_thr_lock;	/* lock for receive thread */
37012011SSriharsha.Basavapatna@Sun.COM 	kcondvar_t		rcv_thr_cv;	/* cond.var for recv thread */
3715373Sraghuram 
3725935Ssb155480 	vsw_ldctx_t		tx;		/* transmit function */
37312011SSriharsha.Basavapatna@Sun.COM 	vsw_ldcrx_pktdata_t	rx_pktdata;	/* process raw data msg */
37412011SSriharsha.Basavapatna@Sun.COM 	vsw_ldcrx_dringdata_t	rx_dringdata;	/* process dring data msg */
3755935Ssb155480 
3765373Sraghuram 	/* channel statistics */
3775373Sraghuram 	vgen_stats_t		ldc_stats;	/* channel statistics */
3785373Sraghuram 	kstat_t			*ksp;		/* channel kstats */
3795373Sraghuram } vsw_ldc_t;
3805373Sraghuram 
3815373Sraghuram /* worker thread flags */
3829217SWentao.Yang@Sun.COM #define	VSW_WTHR_DATARCVD 	0x01	/* data received */
3839217SWentao.Yang@Sun.COM #define	VSW_WTHR_STOP 		0x02	/* stop worker thread request */
3845373Sraghuram 
3855373Sraghuram /* multicast addresses port is interested in */
3865373Sraghuram typedef struct mcst_addr {
3875373Sraghuram 	struct mcst_addr	*nextp;
3885373Sraghuram 	struct ether_addr	mca;	/* multicast address */
3895373Sraghuram 	uint64_t		addr;	/* mcast addr converted to hash key */
3905373Sraghuram 	boolean_t		mac_added; /* added into physical device */
3915373Sraghuram } mcst_addr_t;
3925373Sraghuram 
3935373Sraghuram /* Port detach states */
3945373Sraghuram #define	VSW_PORT_INIT		0x1	/* Initial non-detach state */
3955373Sraghuram #define	VSW_PORT_DETACHING	0x2	/* In process of being detached */
3965373Sraghuram #define	VSW_PORT_DETACHABLE	0x4	/* Safe to detach */
3975373Sraghuram 
3985373Sraghuram /* port information associated with a vsw */
3995373Sraghuram typedef struct vsw_port {
4005373Sraghuram 	int			p_instance;	/* port instance */
4015373Sraghuram 	struct vsw_port		*p_next;	/* next port in the list */
4025373Sraghuram 	struct vsw		*p_vswp;	/* associated vsw */
4036419Ssb155480 	int			num_ldcs;	/* # of ldcs in the port */
4046419Ssb155480 	uint64_t		*ldc_ids;	/* ldc ids */
40512011SSriharsha.Basavapatna@Sun.COM 	vsw_ldc_t		*ldcp;		/* ldc for this port */
4065373Sraghuram 
4075373Sraghuram 	kmutex_t		tx_lock;	/* transmit lock */
4085373Sraghuram 	int			(*transmit)(vsw_ldc_t *, mblk_t *);
4095373Sraghuram 
4105373Sraghuram 	int			state;		/* port state */
4115373Sraghuram 	kmutex_t		state_lock;
4125373Sraghuram 	kcondvar_t		state_cv;
4135373Sraghuram 
4148275SEric Cheng 	krwlock_t		maccl_rwlock;	/* protect fields below */
4158275SEric Cheng 	mac_client_handle_t	p_mch;		/* mac client handle */
4168275SEric Cheng 	mac_unicast_handle_t	p_muh;		/* mac unicast handle */
4178275SEric Cheng 
4185373Sraghuram 	kmutex_t		mca_lock;	/* multicast lock */
4195373Sraghuram 	mcst_addr_t		*mcap;		/* list of multicast addrs */
4205373Sraghuram 
4218275SEric Cheng 	boolean_t		addr_set;	/* Addr set where */
4225373Sraghuram 
4235373Sraghuram 	/*
4245373Sraghuram 	 * mac address of the port & connected device
4255373Sraghuram 	 */
4265373Sraghuram 	struct ether_addr	p_macaddr;
4276419Ssb155480 	uint16_t		pvid;	/* port vlan id (untagged) */
4288275SEric Cheng 	struct vsw_vlanid	*vids;	/* vlan ids (tagged) */
4296419Ssb155480 	uint16_t		nvids;	/* # of vids */
4306419Ssb155480 	mod_hash_t		*vlan_hashp;	/* vlan hash table */
4316419Ssb155480 	uint32_t		vlan_nchains;	/* # of vlan hash chains */
4326495Sspeer 
4336495Sspeer 	/* HybridIO related info */
4346495Sspeer 	uint32_t		p_hio_enabled;	/* Hybrid mode enabled? */
4356495Sspeer 	uint32_t		p_hio_capable;	/* Port capable of HIO */
43610795SWentao.Yang@Sun.COM 
43710795SWentao.Yang@Sun.COM 	/* bandwidth limit */
43810795SWentao.Yang@Sun.COM 	uint64_t		p_bandwidth;	/* bandwidth limit */
4395373Sraghuram } vsw_port_t;
4405373Sraghuram 
4415373Sraghuram /* list of ports per vsw */
4425373Sraghuram typedef struct vsw_port_list {
4435373Sraghuram 	vsw_port_t	*head;		/* head of the list */
4445373Sraghuram 	krwlock_t	lockrw;		/* sync access(rw) to the list */
4455373Sraghuram 	int		num_ports;	/* number of ports in the list */
4465373Sraghuram } vsw_port_list_t;
4475373Sraghuram 
4485373Sraghuram /*
4495373Sraghuram  * Taskq control message
4505373Sraghuram  */
4515373Sraghuram typedef struct vsw_ctrl_task {
4525373Sraghuram 	vsw_ldc_t	*ldcp;
4535373Sraghuram 	def_msg_t	pktp;
4545373Sraghuram 	uint32_t	hss_id;
4555373Sraghuram } vsw_ctrl_task_t;
4565373Sraghuram 
4575373Sraghuram /*
4585373Sraghuram  * State of connection to peer. Some of these states
4595373Sraghuram  * can be mapped to LDC events as follows:
4605373Sraghuram  *
4615373Sraghuram  * VSW_CONN_RESET -> LDC_RESET_EVT
4625373Sraghuram  * VSW_CONN_UP    -> LDC_UP_EVT
4635373Sraghuram  */
4645373Sraghuram #define	VSW_CONN_UP		0x1	/* Connection come up */
4655373Sraghuram #define	VSW_CONN_RESET		0x2	/* Connection reset */
4665373Sraghuram #define	VSW_CONN_RESTART	0x4	/* Restarting handshake on connection */
4675373Sraghuram 
4685373Sraghuram typedef struct vsw_conn_evt {
4695373Sraghuram 	uint16_t	evt;		/* Connection event */
4705373Sraghuram 	vsw_ldc_t	*ldcp;
4715373Sraghuram } vsw_conn_evt_t;
4725373Sraghuram 
4735373Sraghuram /*
4745373Sraghuram  * Ethernet broadcast address definition.
4755373Sraghuram  */
4765373Sraghuram static	struct	ether_addr	etherbroadcastaddr = {
4775373Sraghuram 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
4785373Sraghuram };
4795373Sraghuram 
4805373Sraghuram #define	IS_BROADCAST(ehp) \
4818275SEric Cheng 	(bcmp(&ehp->ether_dhost, &etherbroadcastaddr, ETHERADDRL) == 0)
4825373Sraghuram #define	IS_MULTICAST(ehp) \
4835373Sraghuram 	((ehp->ether_dhost.ether_addr_octet[0] & 01) == 1)
4845373Sraghuram 
4855373Sraghuram #define	READ_ENTER(x)	rw_enter(x, RW_READER)
4865373Sraghuram #define	WRITE_ENTER(x)	rw_enter(x, RW_WRITER)
4875373Sraghuram #define	RW_EXIT(x)	rw_exit(x)
4885373Sraghuram 
4895373Sraghuram #define	VSW_PORT_REFHOLD(portp)	atomic_inc_32(&((portp)->ref_cnt))
4905373Sraghuram #define	VSW_PORT_REFRELE(portp)	atomic_dec_32(&((portp)->ref_cnt))
4915373Sraghuram 
4925373Sraghuram #ifdef	__cplusplus
4935373Sraghuram }
4945373Sraghuram #endif
4955373Sraghuram 
4965373Sraghuram #endif	/* _VSW_LDC_H */
497