xref: /onnv-gate/usr/src/uts/common/sys/nxge/nxge_hio.h (revision 11878:ac93462db6d7)
16495Sspeer /*
26495Sspeer  * CDDL HEADER START
36495Sspeer  *
46495Sspeer  * The contents of this file are subject to the terms of the
56495Sspeer  * Common Development and Distribution License (the "License").
66495Sspeer  * You may not use this file except in compliance with the License.
76495Sspeer  *
86495Sspeer  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96495Sspeer  * or http://www.opensolaris.org/os/licensing.
106495Sspeer  * See the License for the specific language governing permissions
116495Sspeer  * and limitations under the License.
126495Sspeer  *
136495Sspeer  * When distributing Covered Code, include this CDDL HEADER in each
146495Sspeer  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156495Sspeer  * If applicable, add the following below this CDDL HEADER, with the
166495Sspeer  * fields enclosed by brackets "[]" replaced with your own identifying
176495Sspeer  * information: Portions Copyright [yyyy] [name of copyright owner]
186495Sspeer  *
196495Sspeer  * CDDL HEADER END
206495Sspeer  */
216495Sspeer 
226495Sspeer /*
23*11878SVenu.Iyer@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
246495Sspeer  * Use is subject to license terms.
256495Sspeer  */
266495Sspeer 
276495Sspeer #ifndef	_SYS_NXGE_NXGE_HIO_H
286495Sspeer #define	_SYS_NXGE_NXGE_HIO_H
296495Sspeer 
306495Sspeer #ifdef	__cplusplus
316495Sspeer extern "C" {
326495Sspeer #endif
336495Sspeer 
346495Sspeer #include <nxge_mac.h>
356495Sspeer #include <nxge_ipp.h>
366495Sspeer #include <nxge_fflp.h>
378275SEric Cheng #include <sys/mac_provider.h>
386495Sspeer 
396495Sspeer #define	isLDOMservice(nxge) \
406495Sspeer 	(nxge->environs == SOLARIS_SERVICE_DOMAIN)
416495Sspeer #define	isLDOMguest(nxge) \
426495Sspeer 	(nxge->environs == SOLARIS_GUEST_DOMAIN)
436495Sspeer #define	isLDOMs(nxge) \
446495Sspeer 	(isLDOMservice(nxge) || isLDOMguest(nxge))
456495Sspeer 
4610309SSriharsha.Basavapatna@Sun.COM #define	NXGE_HIO_SHARE_MIN_CHANNELS	2
4710309SSriharsha.Basavapatna@Sun.COM #define	NXGE_HIO_SHARE_MAX_CHANNELS	2
4810309SSriharsha.Basavapatna@Sun.COM 
496495Sspeer /* ------------------------------------------------------------------ */
506495Sspeer typedef uint8_t nx_rdc_t;
516495Sspeer typedef uint8_t nx_tdc_t;
526495Sspeer 
536495Sspeer typedef uint64_t res_map_t;
546495Sspeer 
556495Sspeer typedef uint64_t hv_rv_t;
566495Sspeer 
576495Sspeer typedef hv_rv_t (*vr_assign)(uint64_t, uint64_t, uint32_t *);
586495Sspeer typedef hv_rv_t (*vr_unassign)(uint32_t);
596495Sspeer typedef hv_rv_t (*vr_getinfo)(uint32_t, uint64_t *, uint64_t *);
606495Sspeer 
6111304SJanie.Lu@Sun.COM /* HV 2.0 API group functions */
6211304SJanie.Lu@Sun.COM typedef hv_rv_t (*vr_cfgh_assign)(uint64_t, uint64_t, uint64_t, uint32_t *);
6311304SJanie.Lu@Sun.COM typedef hv_rv_t (*vrlp_cfgh_conf)(uint64_t, uint64_t, uint64_t, uint64_t,
6411304SJanie.Lu@Sun.COM     uint64_t);
6511304SJanie.Lu@Sun.COM typedef hv_rv_t (*vrlp_cfgh_info)(uint64_t, uint64_t, uint64_t, uint64_t *,
6611304SJanie.Lu@Sun.COM     uint64_t *);
6711304SJanie.Lu@Sun.COM 
686495Sspeer 
696495Sspeer typedef struct {
7011304SJanie.Lu@Sun.COM 	vr_assign	assign;		/* HV Major 1 interface */
7111304SJanie.Lu@Sun.COM 	vr_cfgh_assign	cfgh_assign;	/* HV Major 2 interface */
726495Sspeer 	vr_unassign	unassign;
736495Sspeer 	vr_getinfo	getinfo;
746495Sspeer } nxhv_vr_fp_t;
756495Sspeer 
766495Sspeer typedef hv_rv_t (*vrlp_conf)(uint64_t, uint64_t, uint64_t, uint64_t);
776495Sspeer typedef hv_rv_t (*vrlp_info)(uint64_t, uint64_t, uint64_t *, uint64_t *);
786495Sspeer 
796495Sspeer typedef hv_rv_t (*dc_assign)(uint32_t, uint64_t, uint64_t *);
806495Sspeer typedef hv_rv_t (*dc_unassign)(uint32_t, uint64_t);
816495Sspeer typedef hv_rv_t (*dc_getstate)(uint32_t, uint64_t, uint64_t *);
826495Sspeer typedef hv_rv_t (*dc_get_map)(uint32_t, uint64_t *);
836495Sspeer 
846495Sspeer typedef hv_rv_t (*dc_getinfo)(uint32_t, uint64_t, uint64_t *, uint64_t *);
856495Sspeer 
866495Sspeer typedef struct {
876495Sspeer 	dc_assign	assign;
886495Sspeer 	dc_unassign	unassign;
896495Sspeer 	dc_getstate	getstate;
906495Sspeer 	dc_get_map	get_map;
916495Sspeer 
9211304SJanie.Lu@Sun.COM 	vrlp_conf	lp_conf;	/* HV Major 1 interface */
9311304SJanie.Lu@Sun.COM 	vrlp_info	lp_info;	/* HV Major 1 interface */
9411304SJanie.Lu@Sun.COM 	vrlp_cfgh_conf	lp_cfgh_conf;	/* HV Major 2 interface */
9511304SJanie.Lu@Sun.COM 	vrlp_cfgh_info	lp_cfgh_info;	/* HV Major 2 interface */
966495Sspeer 	dc_getinfo	getinfo;
976495Sspeer } nxhv_dc_fp_t;
986495Sspeer 
996495Sspeer typedef struct {
1006495Sspeer 	boolean_t	ldoms;
1016495Sspeer 	nxhv_vr_fp_t	vr;
1026495Sspeer 	nxhv_dc_fp_t	tx;
1036495Sspeer 	nxhv_dc_fp_t	rx;
1046495Sspeer } nxhv_fp_t;
1056495Sspeer 
1066495Sspeer /* ------------------------------------------------------------------ */
1076495Sspeer #define	NXGE_VR_SR_MAX		8 /* There are 8 subregions (SR). */
1086495Sspeer 
1096495Sspeer typedef enum {
11010577SMichael.Speer@Sun.COM 	NXGE_HIO_TYPE_SERVICE = 0x80,	/* We are a service domain driver. */
11110577SMichael.Speer@Sun.COM 	NXGE_HIO_TYPE_GUEST		/* We are a guest domain driver. */
1126495Sspeer } nxge_hio_type_t;
1136495Sspeer 
1146495Sspeer typedef enum {
1156495Sspeer 	FUNC0_MNT,
1166495Sspeer 	FUNC0_VIR = 0x1000000,
1176495Sspeer 	FUNC1_MNT = 0x2000000,
1186495Sspeer 	FUNC1_VIR = 0x3000000,
1196495Sspeer 	FUNC2_MNT = 0x4000000,
1206495Sspeer 	FUNC2_VIR = 0x5000000,
1216495Sspeer 	FUNC3_MNT = 0x6000000,
1226495Sspeer 	FUNC3_VIR = 0x7000000
1236495Sspeer } vr_base_address_t;
1246495Sspeer 
1256495Sspeer #define	VR_STEP		0x2000000
1266495Sspeer #define	VR_VC_STEP	0x0004000
1276495Sspeer 
1286495Sspeer typedef enum {			/* 0-8 */
1296495Sspeer 	FUNC0_VIR0,
1306495Sspeer 	FUNC0_VIR1,
1316495Sspeer 	FUNC1_VIR0,
1326495Sspeer 	FUNC1_VIR1,
1336495Sspeer 	FUNC2_VIR0,
1346495Sspeer 	FUNC2_VIR1,
1356495Sspeer 	FUNC3_VIR0,
1366495Sspeer 	FUNC3_VIR1,
1376495Sspeer 	FUNC_VIR_MAX
1386495Sspeer } vr_region_t;
1396495Sspeer 
1406495Sspeer typedef enum {
1416495Sspeer 	VP_CHANNEL_0,
1426495Sspeer 	VP_CHANNEL_1,
1436495Sspeer 	VP_CHANNEL_2,
1446495Sspeer 	VP_CHANNEL_3,
1456495Sspeer 	VP_CHANNEL_4,
1466495Sspeer 	VP_CHANNEL_5,
1476495Sspeer 	VP_CHANNEL_6,
1486495Sspeer 	VP_CHANNEL_7,
1496495Sspeer 	VP_CHANNEL_MAX
1506495Sspeer } vp_channel_t;
1516495Sspeer 
1526495Sspeer typedef enum {
1537950SMichael.Speer@Sun.COM 	VP_BOUND_TX = 1,
1546495Sspeer 	VP_BOUND_RX
1556495Sspeer } vpc_type_t;
1566495Sspeer 
1576495Sspeer #define	VP_VC_OFFSET(channel)	(channel << 10)
1586495Sspeer #define	VP_RDC_OFFSET		(1 << 9)
1596495Sspeer 
1606495Sspeer typedef enum {
1616495Sspeer 	RXDMA_CFIG1		= 0,
1626495Sspeer 	RXDMA_CFIG2		= 8,
1636495Sspeer 	RBR_CFIG_A		= 0x10,
1646495Sspeer 	RBR_CFIG_B		= 0x18,
1656495Sspeer 	RBR_KICK		= 0x20,
1666495Sspeer 	RBR_STAT		= 0x28,
1676495Sspeer 	RBR_HDH			= 0x30,
1686495Sspeer 	RBR_HDL			= 0x38,
1696495Sspeer 	RCRCFIG_A		= 0x40,
1706495Sspeer 	RCRCFIG_B		= 0x48,
1716495Sspeer 	RCRSTAT_A		= 0x50,
1726495Sspeer 	RCRSTAT_B		= 0x58,
1736495Sspeer 	RCRSTAT_C		= 0x60,
1746495Sspeer 	RX_DMA_ENT_MSK		= 0x68,
1756495Sspeer 	RX_DMA_CTL_STAT		= 0x70,
1766495Sspeer 	RCR_FLSH		= 0x78,
1776495Sspeer 	RXMISC			= 0x90,
1786495Sspeer 	RX_DMA_CTL_STAT_DBG	= 0x98
1796495Sspeer 
1806495Sspeer } rdc_csr_offset_t;
1816495Sspeer 
1826495Sspeer typedef enum {
1836495Sspeer 	Tx_RNG_CFIG		= 0,
1846495Sspeer 	Tx_RNG_HDL		= 0x10,
1856495Sspeer 	Tx_RNG_KICK		= 0x18,
1866495Sspeer 	Tx_ENT_MASK		= 0x20,
1876495Sspeer 	Tx_CS			= 0x28,
1886495Sspeer 	TxDMA_MBH		= 0x30,
1896495Sspeer 	TxDMA_MBL		= 0x38,
1906495Sspeer 	TxDMA_PRE_ST		= 0x40,
1916495Sspeer 	Tx_RNG_ERR_LOGH		= 0x48,
1926495Sspeer 	Tx_RNG_ERR_LOGL		= 0x50,
1936495Sspeer 	TDMC_INTR_DBG		= 0x60,
1946495Sspeer 	Tx_CS_DBG		= 0x68
1956495Sspeer 
1966495Sspeer } tdc_csr_offset_t;
1976495Sspeer 
1986495Sspeer /*
1996495Sspeer  * -------------------------------------------------------------
2006495Sspeer  * These definitions are used to handle the virtual PIO_LDSV
2016495Sspeer  * space of a VR.
2026495Sspeer  * -------------------------------------------------------------
2036495Sspeer  */
2046495Sspeer #define	VLDG_OFFSET		0x2000
2056495Sspeer #define	VLDG_SLL		5
2066495Sspeer 
2076495Sspeer typedef enum {
2086495Sspeer 	PIO_LDSV0,		/* ldf_0, 0-63 */
2096495Sspeer 	PIO_LDSV1,		/* ldf_1, 0-63 */
2106495Sspeer 	PIO_LDSV2,		/* ldf_0 & ldf_1, 64-69 */
2116495Sspeer 	PIO_LDGIMGN		/* arm/timer */
2126495Sspeer 
2136495Sspeer } pio_ld_op_t;
2146495Sspeer 
2156495Sspeer #define	VR_INTR_BLOCK_SIZE	8
2166495Sspeer #define	HIO_INTR_BLOCK_SIZE	4
2176495Sspeer 
2186495Sspeer /* ------------------------------------------------------------------ */
2196495Sspeer typedef struct {
2206495Sspeer 	const char	*name;
2216495Sspeer 	int		offset;
2226495Sspeer } dmc_reg_name_t;
2236495Sspeer 
2246495Sspeer typedef struct {
2256495Sspeer 	uintptr_t	nxge;
2266495Sspeer 	dc_map_t	map;
2276495Sspeer 
2286495Sspeer } nx_rdc_tbl_t;
2296495Sspeer 
2306495Sspeer typedef struct nxge_hio_vr {
2316495Sspeer 	uintptr_t	nxge;
2326495Sspeer 
2336495Sspeer 	uint32_t	cookie;	/* The HV cookie. */
2346495Sspeer 	uintptr_t	address;
2356495Sspeer 	size_t		size;
2366495Sspeer 	vr_region_t	region;	/* 1 of 8 regions. */
2376495Sspeer 
2388275SEric Cheng 	int		rdc_tbl; /* 1 of 8 RDC tables. */
2398275SEric Cheng 	int		tdc_tbl; /* 1 of 8 TDC tables. */
2406495Sspeer 	ether_addr_t	altmac;	/* The alternate MAC address. */
2418275SEric Cheng 	int		slot;	/* According to nxge_m_mmac_add(). */
2426495Sspeer 
2436495Sspeer 	nxge_grp_t	rx_group;
2446495Sspeer 	nxge_grp_t	tx_group;
2456495Sspeer 
2466495Sspeer } nxge_hio_vr_t;
2476495Sspeer 
2486495Sspeer typedef nxge_status_t (*dc_init_t)(nxge_t *, int);
2496495Sspeer typedef void (*dc_uninit_t)(nxge_t *, int);
2506495Sspeer 
2516495Sspeer typedef struct {
2526495Sspeer 	uint32_t	number;	/* The LDG number assigned to this DC. */
2536495Sspeer 	uint64_t	index;	/* Bits 7:5 of the (virtual) PIO_LDSV. */
2546495Sspeer 
2556495Sspeer 	uint64_t	ldsv;	/* The logical device number */
2566495Sspeer 	uint64_t	map;	/* Currently unused */
2576495Sspeer 
2586495Sspeer 	int		vector;	/* The DDI vector number (index) */
2596495Sspeer } hio_ldg_t;
2606495Sspeer 
2616495Sspeer /*
2626495Sspeer  * -------------------------------------------------------------
2636495Sspeer  * The service domain driver makes use of both <index>, the index
2646495Sspeer  * into a VR's virtual page, and <channel>, the absolute channel
2656495Sspeer  * number, what we will call here the physical channel number.
2666495Sspeer  *
2676495Sspeer  * The guest domain will set both fields to the same value, since
2686495Sspeer  * it doesn't know any better.  And if a service domain owns a
2696495Sspeer  * DMA channel, it will also set both fields to the same value,
2706495Sspeer  * since it is not using a VR per se.
2716495Sspeer  * -------------------------------------------------------------
2726495Sspeer  */
2736495Sspeer typedef struct nx_dc {
2746495Sspeer 
2756495Sspeer 	struct nx_dc	*next;
2766495Sspeer 
2776495Sspeer 	nxge_hio_vr_t	*vr;	/* The VR belonged to. */
2786495Sspeer 
2796495Sspeer 	vp_channel_t	page;	/* VP_CHANNEL_0 - VP_CHANNEL_7 */
2806495Sspeer 	nxge_channel_t	channel; /* 1 of 16/24 channels */
2816495Sspeer 	/*
2826495Sspeer 	 * <channel> has its normal meaning. <page> refers to the
2836495Sspeer 	 * virtual page of the VR that <channel> has been bound to.
2846495Sspeer 	 * Therefore, in the service domain, <page> & <channel>
2856495Sspeer 	 * are almost always different. While in a guest domain,
2866495Sspeer 	 * they are always the same.
2876495Sspeer 	 */
2886495Sspeer 	vpc_type_t	type;	/* VP_BOUND_XX */
2896495Sspeer 	dc_init_t	init;	/* nxge_init_xxdma_channel() */
2906495Sspeer 	dc_uninit_t	uninit;	/* nxge_uninit_xxdma_channel() */
2916495Sspeer 
2927755SMisaki.Kataoka@Sun.COM 	nxge_grp_t	*group;	/* The group belonged to. */
2936495Sspeer 	uint32_t	cookie;	/* The HV cookie. */
2946495Sspeer 
2956495Sspeer 	hio_ldg_t	ldg;
2966495Sspeer 	boolean_t	interrupting; /* Interrupt enabled? */
2976495Sspeer 
2986495Sspeer } nxge_hio_dc_t;
2996495Sspeer 
3006495Sspeer typedef struct {
3016495Sspeer 	nxge_hio_type_t		type;
3026495Sspeer 
3036495Sspeer 	kmutex_t		lock;
3047755SMisaki.Kataoka@Sun.COM 	int			vrs;
3056495Sspeer 	unsigned		sequence;
3066495Sspeer 
3076495Sspeer 	nxhv_fp_t		hio;
3086495Sspeer 
3096495Sspeer 	/* vr[0] is reserved for the service domain. */
3106495Sspeer 	nxge_hio_vr_t		vr[NXGE_VR_SR_MAX]; /* subregion map */
3116495Sspeer 	nxge_hio_dc_t		rdc[NXGE_MAX_RDCS];
3126495Sspeer 	nxge_hio_dc_t		tdc[NXGE_MAX_TDCS];
3136495Sspeer 
3146495Sspeer 	nx_rdc_tbl_t		rdc_tbl[NXGE_MAX_RDC_GROUPS];
3156495Sspeer 
3166495Sspeer } nxge_hio_data_t;
3176495Sspeer 
3186495Sspeer /*
3196495Sspeer  * -------------------------------------------------------------
3206495Sspeer  * prototypes
3216495Sspeer  * -------------------------------------------------------------
3226495Sspeer  */
3236495Sspeer extern void nxge_get_environs(nxge_t *);
3246495Sspeer extern int nxge_hio_init(nxge_t *);
3256495Sspeer extern void nxge_hio_uninit(nxge_t *);
3266495Sspeer 
3276495Sspeer extern int nxge_dci_map(nxge_t *, vpc_type_t, int);
3286495Sspeer 
3296495Sspeer /*
3306495Sspeer  * ---------------------------------------------------------------------
3316495Sspeer  * These are the general-purpose DMA channel group functions.  That is,
3326495Sspeer  * these functions are used to manage groups of TDCs or RDCs in an HIO
3336495Sspeer  * environment.
3346495Sspeer  *
3356495Sspeer  * But is also expected that in the future they will be able to manage
3366495Sspeer  * Crossbow groups.
3376495Sspeer  * ---------------------------------------------------------------------
3386495Sspeer  */
3397755SMisaki.Kataoka@Sun.COM extern nxge_grp_t *nxge_grp_add(nxge_t *, nxge_grp_type_t);
3407755SMisaki.Kataoka@Sun.COM extern void nxge_grp_remove(nxge_t *, nxge_grp_t *);
3417755SMisaki.Kataoka@Sun.COM extern int nxge_grp_dc_add(nxge_t *, nxge_grp_t *, vpc_type_t, int);
3426495Sspeer extern void nxge_grp_dc_remove(nxge_t *, vpc_type_t, int);
3436495Sspeer extern nxge_hio_dc_t *nxge_grp_dc_find(nxge_t *, vpc_type_t, int);
3446495Sspeer 
3456495Sspeer extern void nxge_delay(int);
3466495Sspeer extern const char *nxge_ddi_perror(int);
3476495Sspeer 
3486495Sspeer /*
3496495Sspeer  * ---------------------------------------------------------------------
3506495Sspeer  * These are the Sun4v HIO function prototypes.
3516495Sspeer  * ---------------------------------------------------------------------
3526495Sspeer  */
3536495Sspeer extern void nxge_hio_group_get(void *arg, mac_ring_type_t type, int group,
3546495Sspeer 	mac_group_info_t *infop, mac_group_handle_t ghdl);
3558275SEric Cheng extern int nxge_hio_share_alloc(void *arg, mac_share_handle_t *shandle);
3566495Sspeer extern void nxge_hio_share_free(mac_share_handle_t shandle);
3576495Sspeer extern void nxge_hio_share_query(mac_share_handle_t shandle,
3588275SEric Cheng 	mac_ring_type_t type, mac_ring_handle_t *rings, uint_t *n_rings);
3598275SEric Cheng extern int nxge_hio_share_add_group(mac_share_handle_t,
3608275SEric Cheng     mac_group_driver_t);
3618275SEric Cheng extern int nxge_hio_share_rem_group(mac_share_handle_t,
3628275SEric Cheng     mac_group_driver_t);
3638275SEric Cheng extern int nxge_hio_share_bind(mac_share_handle_t, uint64_t cookie,
3648275SEric Cheng     uint64_t *rcookie);
3658275SEric Cheng extern void nxge_hio_share_unbind(mac_share_handle_t);
3668400SNicolas.Droux@Sun.COM extern int nxge_hio_rxdma_bind_intr(nxge_t *, rx_rcr_ring_t *, int);
3676495Sspeer 
3686495Sspeer 				/* nxge_hio_guest.c */
3696495Sspeer extern void nxge_hio_unregister(nxge_t *);
370*11878SVenu.Iyer@Sun.COM extern int nxge_hio_get_dc_htable_idx(nxge_t *nxge, vpc_type_t type,
371*11878SVenu.Iyer@Sun.COM     uint32_t channel);
3726495Sspeer 
3736495Sspeer extern int nxge_guest_regs_map(nxge_t *);
3746495Sspeer extern void nxge_guest_regs_map_free(nxge_t *);
3756495Sspeer 
3766495Sspeer extern int nxge_hio_vr_add(nxge_t *nxge);
3776495Sspeer extern int nxge_hio_vr_release(nxge_t *nxge);
3786495Sspeer 
3796495Sspeer extern nxge_status_t nxge_tdc_lp_conf(p_nxge_t, int);
3806495Sspeer extern nxge_status_t nxge_rdc_lp_conf(p_nxge_t, int);
3816495Sspeer 
3826495Sspeer extern void nxge_hio_start_timer(nxge_t *);
3836495Sspeer 
3846495Sspeer 				/* nxge_intr.c */
3856495Sspeer extern nxge_status_t nxge_hio_intr_init(nxge_t *);
3866495Sspeer extern void nxge_hio_intr_uninit(nxge_t *);
3876495Sspeer 
3886495Sspeer extern nxge_status_t nxge_intr_add(nxge_t *, vpc_type_t, int);
3896495Sspeer extern nxge_status_t nxge_intr_remove(nxge_t *, vpc_type_t, int);
3906495Sspeer 
3916495Sspeer extern nxge_status_t nxge_hio_intr_add(nxge_t *, vpc_type_t, int);
3926495Sspeer extern nxge_status_t nxge_hio_intr_remove(nxge_t *, vpc_type_t, int);
3936495Sspeer 
3946495Sspeer extern nxge_status_t nxge_hio_intr_add(nxge_t *, vpc_type_t, int);
3956495Sspeer extern nxge_status_t nxge_hio_intr_rem(nxge_t *, int);
3966495Sspeer 
397*11878SVenu.Iyer@Sun.COM extern int nxge_hio_ldsv_add(nxge_t *, nxge_hio_dc_t *);
3986495Sspeer 
3996495Sspeer extern void nxge_hio_ldsv_im(nxge_t *, nxge_ldg_t *, pio_ld_op_t, uint64_t *);
4006495Sspeer extern void nxge_hio_ldgimgn(nxge_t *, nxge_ldg_t *);
4016495Sspeer 
4026495Sspeer 				/* nxge_hv.c */
4036495Sspeer extern void nxge_hio_hv_init(nxge_t *);
4046495Sspeer 
4056495Sspeer 				/* nxge_mac.c */
4066495Sspeer extern int nxge_hio_hostinfo_get_rdc_table(p_nxge_t);
4076495Sspeer extern int nxge_hio_hostinfo_init(nxge_t *, nxge_hio_vr_t *, ether_addr_t *);
4086495Sspeer extern void nxge_hio_hostinfo_uninit(nxge_t *, nxge_hio_vr_t *);
4096495Sspeer 
4106495Sspeer #ifdef	__cplusplus
4116495Sspeer }
4126495Sspeer #endif
4136495Sspeer 
4146495Sspeer #endif	/* _SYS_NXGE_NXGE_HIO_H */
415