/*-
 * Copyright(c) 2002-2011 Exar Corp.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification are permitted provided the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *
 *    3. Neither the name of the Exar Corporation nor the names of its
 *       contributors may be used to endorse or promote products derived from
 *       this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
/*$FreeBSD: release/9.2.0/sys/dev/vxge/vxgehal/vxgehal-mrpcim.c 221167 2011-04-28 14:33:15Z gnn $*/

#include <dev/vxge/vxgehal/vxgehal.h>

/*
 * vxge_hal_mrpcim_serial_number_get - Returns the serial number
 * @devh: HAL device handle.
 *
 * Return the serial number
 */
const u8 *
vxge_hal_mrpcim_serial_number_get(vxge_hal_device_h devh)
{
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (NULL);
	}

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (hldev->mrpcim->vpd_data.serial_num);
}

/*
 * vxge_hal_mrpcim_vpath_map_get - Returns the assigned vpaths map
 * @pdev: PCI device object.
 * @regh0: BAR0 mapped memory handle (Solaris), or simply PCI device @pdev
 *	(Linux and the rest.)
 * @bar0: Address of BAR0 in PCI config
 * @func: Function Number
 *
 * Returns the assigned vpaths map
 */
u64
vxge_hal_mrpcim_vpath_map_get(
    pci_dev_h pdev,
    pci_reg_h regh0,
    u8 *bar0,
    u32 func)
{
	u64 val64;
	vxge_hal_legacy_reg_t *legacy_reg;
	vxge_hal_toc_reg_t *toc_reg;
	vxge_hal_vpath_reg_t *vpath_reg;

	vxge_assert(bar0 != NULL);

	vxge_hal_trace_log_driver("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_driver(
	    "pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
	    "bar0 = 0x"VXGE_OS_STXFMT", func = %d",
	    (ptr_t) pdev, (ptr_t) regh0, (ptr_t) bar0, func);

	legacy_reg = (vxge_hal_legacy_reg_t *)
	    vxge_hal_device_get_legacy_reg(pdev, regh0, bar0);

	val64 = vxge_os_pio_mem_read64(pdev, regh0,
	    &legacy_reg->toc_first_pointer);

	toc_reg = (vxge_hal_toc_reg_t *) ((void *)(bar0 + val64));

	val64 = vxge_os_pio_mem_read64(pdev, regh0,
	    &toc_reg->toc_vpath_pointer[0]);

	vpath_reg = (vxge_hal_vpath_reg_t *) ((void *)(bar0 + val64));

	val64 = __hal_vpath_vpath_map_get(pdev, regh0, 0, 0, func, vpath_reg);

	vxge_hal_trace_log_driver("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (val64);
}

/*
 * vxge_hal_mrpcim_pcie_func_mode_set - Set PCI-E function mode
 * @devh: Device Handle.
 * @func_mode: PCI-E func mode. Please see vxge_hal_pcie_function_mode_e{}
 *
 * Set PCI-E function mode.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_pcie_func_mode_set(
    vxge_hal_device_h devh,
    vxge_hal_pcie_function_mode_e func_mode)
{
	__hal_device_t *hldev = (__hal_device_t *) devh;
	u32 fmode;
	vxge_hal_status_e status;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_driver("devh = 0x"VXGE_OS_STXFMT
	    ",func_mode = %d", (ptr_t) devh, func_mode);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	switch (func_mode) {
	case VXGE_HAL_PCIE_FUNC_MODE_SF1_VP17:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_SF1_VP17;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MF8_VP2:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MF8_VP2;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_SR17_VP1:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_SR17_VP1;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MR17_VP1:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MR17_VP1;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MR8_VP2:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MR8_VP2;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MF17_VP1:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MF17_VP1;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_SR8_VP2:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_SR8_VP2;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_SR4_VP4:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_SR4_VP4;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MF2_VP8:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MF2_VP8;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MF4_VP4:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MF4_VP4;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MR4_VP4:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MR4_VP4;
		break;
	case VXGE_HAL_PCIE_FUNC_MODE_MF8P_VP2:
		fmode =
		    VXGE_HAL_RTS_ACCESS_STEER_DATA0_FUNC_MODE_MF8P_VP2;
		break;
	default:
		vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_INVALID_TYPE);

		return (VXGE_HAL_ERR_INVALID_TYPE);
	}

	status = __hal_vpath_pcie_func_mode_set(hldev, hldev->first_vp_id, fmode);

	vxge_hal_trace_log_driver("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (status);

}

/*
 * vxge_hal_mrpcim_fw_upgrade - Upgrade firmware
 * @pdev: PCI device object.
 * @regh0: BAR0 mapped memory handle (Solaris), or simply PCI device @pdev
 *	(Linux and the rest.)
 * @bar0: Address of BAR0 in PCI config
 * @buffer: Buffer containing F/W image
 * @length: F/W image length
 *
 * Upgrade firmware
 */
vxge_hal_status_e
vxge_hal_mrpcim_fw_upgrade(
    pci_dev_h pdev,
    pci_reg_h regh0,
    u8 *bar0,
    u8 *buffer,
    u32 length)
{
	u64 val64, vpath_mask;
	u32 host_type, func_id, i;
	vxge_hal_legacy_reg_t *legacy_reg;
	vxge_hal_toc_reg_t *toc_reg;
	vxge_hal_mrpcim_reg_t *mrpcim_reg;
	vxge_hal_common_reg_t *common_reg;
	vxge_hal_vpmgmt_reg_t *vpmgmt_reg;
	vxge_hal_vpath_reg_t *vpath_reg;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert((bar0 != NULL) && (buffer != NULL));

	vxge_hal_trace_log_driver("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_driver(
	    "pdev = 0x"VXGE_OS_STXFMT", regh0 = 0x"VXGE_OS_STXFMT", "
	    "bar0 = 0x"VXGE_OS_STXFMT", buffer = 0x"VXGE_OS_STXFMT", "
	    "length = %d", (ptr_t) pdev, (ptr_t) regh0, (ptr_t) bar0,
	    (ptr_t) buffer, length);

	legacy_reg = (vxge_hal_legacy_reg_t *)
	    vxge_hal_device_get_legacy_reg(pdev, regh0, bar0);

	val64 = vxge_os_pio_mem_read64(pdev, regh0,
	    &legacy_reg->toc_first_pointer);

	toc_reg = (vxge_hal_toc_reg_t *) ((void *)(bar0 + val64));

	val64 =
	    vxge_os_pio_mem_read64(pdev, regh0, &toc_reg->toc_common_pointer);

	common_reg = (vxge_hal_common_reg_t *) ((void *)(bar0 + val64));

	vpath_mask = vxge_os_pio_mem_read64(pdev, regh0,
	    &common_reg->vpath_assignments);

	val64 = vxge_os_pio_mem_read64(pdev, regh0,
	    &common_reg->host_type_assignments);

	host_type = (u32)
	    VXGE_HAL_HOST_TYPE_ASSIGNMENTS_GET_HOST_TYPE_ASSIGNMENTS(val64);

	for (i = 0; i < VXGE_HAL_MAX_VIRTUAL_PATHS; i++) {

		if (!((vpath_mask) & mBIT(i)))
			continue;

		val64 = vxge_os_pio_mem_read64(pdev, regh0,
		    &toc_reg->toc_vpmgmt_pointer[i]);

		vpmgmt_reg = (vxge_hal_vpmgmt_reg_t *) ((void *)(bar0 + val64));

		val64 = vxge_os_pio_mem_read64(pdev, regh0,
		    &vpmgmt_reg->vpath_to_func_map_cfg1);

		func_id = (u32) VXGE_HAL_VPATH_TO_FUNC_MAP_CFG1_GET_CFG1(val64);

		if (!(__hal_device_access_rights_get(host_type, func_id) &
		    VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

			vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d",
			    __FILE__, __func__, __LINE__,
			    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

			return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		}

		val64 = vxge_os_pio_mem_read64(pdev, regh0,
		    &toc_reg->toc_vpath_pointer[i]);

		vpath_reg = (vxge_hal_vpath_reg_t *) ((void *)(bar0 + val64));

		status = __hal_vpath_fw_upgrade(pdev, regh0,
		    i, vpath_reg, buffer, length);

		break;
	}

	if (status == VXGE_HAL_OK) {
		val64 = vxge_os_pio_mem_read64(pdev, regh0,
		    &toc_reg->toc_mrpcim_pointer);

		mrpcim_reg = (vxge_hal_mrpcim_reg_t *) ((void *)(bar0 + val64));

		val64 = vxge_os_pio_mem_read64(pdev, regh0,
		    &mrpcim_reg->sw_reset_cfg1);

		val64 |= VXGE_HAL_SW_RESET_CFG1_TYPE;

		vxge_os_pio_mem_write64(pdev, regh0,
		    val64,
		    &mrpcim_reg->sw_reset_cfg1);

		vxge_os_pio_mem_write64(pdev, regh0,
		    VXGE_HAL_PF_SW_RESET_PF_SW_RESET(
		    VXGE_HAL_PF_SW_RESET_COMMAND),
		    &mrpcim_reg->bf_sw_reset);

		vxge_os_mdelay(100);
	}

	vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * vxge_hal_mrpcim_vpath_qos_set - Set the priority, Guaranteed and maximum
 *				 bandwidth for a vpath.
 * @devh: HAL device handle.
 * @vp_id: Vpath Id.
 * @priority: Priority
 * @min_bandwidth: Minimum Bandwidth
 * @max_bandwidth: Maximum Bandwidth
 *
 * Set the Guaranteed and maximum bandwidth for a given vpath
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_vpath_qos_set(
    vxge_hal_device_h devh,
    u32 vp_id,
    u32 priority,
    u32 min_bandwidth,
    u32 max_bandwidth)
{
	vxge_hal_status_e status = VXGE_HAL_OK;
	vxge_hal_vpath_qos_config_t config;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT", vp_id = %d, "
	    "priority = %d, min_bandwidth = %d, max_bandwidth = %d",
	    (ptr_t) devh, vp_id, priority, min_bandwidth, max_bandwidth);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	if (vp_id >= VXGE_HAL_MAX_VIRTUAL_PATHS) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);

		return (VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
	}

	config.priority = priority;
	config.min_bandwidth = min_bandwidth;
	config.max_bandwidth = max_bandwidth;

	if ((status = __hal_vpath_qos_config_check(&config)) != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	if (status == VXGE_HAL_OK) {
		hldev->header.config.mrpcim_config.vp_qos[vp_id].priority =
		    priority;
		hldev->header.config.mrpcim_config.vp_qos[vp_id].min_bandwidth =
		    min_bandwidth;
		hldev->header.config.mrpcim_config.vp_qos[vp_id].max_bandwidth =
		    max_bandwidth;
	}

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * vxge_hal_mrpcim_vpath_qos_get - Get the priority, Guaranteed and maximum
 *				 bandwidth for a vpath.
 * @devh: HAL device handle.
 * @vp_id: Vpath Id.
 * @priority: Buffer to return Priority
 * @min_bandwidth: Buffer to return Minimum Bandwidth
 * @max_bandwidth: Buffer to return Maximum Bandwidth
 *
 * Get the Guaranteed and maximum bandwidth for a given vpath
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_vpath_qos_get(
    vxge_hal_device_h devh,
    u32 vp_id,
    u32 *priority,
    u32 *min_bandwidth,
    u32 *max_bandwidth)
{
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", vp_id = %d, "
	    "priority = 0x"VXGE_OS_STXFMT", "
	    "min_bandwidth = 0x"VXGE_OS_STXFMT", "
	    "max_bandwidth = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, vp_id, (ptr_t) priority,
	    (ptr_t) min_bandwidth, (ptr_t) max_bandwidth);

	if (vp_id >= VXGE_HAL_MAX_VIRTUAL_PATHS) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);

		return (VXGE_HAL_ERR_VPATH_NOT_AVAILABLE);
	}

	*priority =
	    hldev->header.config.mrpcim_config.vp_qos[vp_id].min_bandwidth;

	*min_bandwidth =
	    hldev->header.config.mrpcim_config.vp_qos[vp_id].min_bandwidth;

	*max_bandwidth =
	    hldev->header.config.mrpcim_config.vp_qos[vp_id].max_bandwidth;

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * __hal_mrpcim_mdio_access - Access the MDIO device
 * @devh: HAL Device handle.
 * @port: Port id
 * @operation: Type of operation
 * @device: MMD device address
 * @addr: MMD address
 * @data: MMD data
 *
 * Access the data from a MDIO Device.
 *
 */
vxge_hal_status_e
__hal_mrpcim_mdio_access(
    vxge_hal_device_h devh,
    u32 port,
    u32 operation,
    u32 device,
    u16 addr,
    u16 *data)
{
	u64 val64;
	u32 prtad;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert((devh != NULL) && (data != NULL));

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", operation = %d, "
	    "device = %d, addr = %d, data = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, operation, device, addr, (ptr_t) data);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	if (device == VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_DTE_XS) {
		if (port == 0)
			prtad = hldev->mrpcim->mdio_dte_prtad0;
		else
			prtad = hldev->mrpcim->mdio_dte_prtad1;
	} else {
		if (port == 0)
			prtad = hldev->mrpcim->mdio_phy_prtad0;
		else
			prtad = hldev->mrpcim->mdio_phy_prtad1;
	}

	val64 = VXGE_HAL_MDIO_MGR_ACCESS_PORT_STROBE_ONE |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE(operation) |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD(device) |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR(addr) |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DATA(*data) |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ST_PATTERN(0) |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_PREAMBLE |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_PRTAD(prtad) |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_STROBE_TWO;

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->mdio_mgr_access_port[port]);

	vxge_os_wmb();

	status = vxge_hal_device_register_poll(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mdio_mgr_access_port[port],
	    0,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_STROBE_ONE |
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_STROBE_TWO,
	    hldev->header.config.device_poll_millis);

	if ((status == VXGE_HAL_OK) &&
	    ((operation == VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_READ_INCR) ||
	    (operation == VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_READ) ||
	    (operation ==
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ_INCR) ||
	    (operation == VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ))) {

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->mdio_mgr_access_port[port]);

		*data = (u16) VXGE_HAL_MDIO_MGR_ACCESS_GET_PORT_DATA(val64);

	} else {
		*data = 0;
	}

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);

	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_intr_enable - Enable the interrupts on mrpcim.
 * @devh: HAL device handle.
 *
 * Enable mrpcim interrupts
 *
 * See also: vxge_hal_mrpcim_intr_disable().
 */
vxge_hal_status_e
vxge_hal_mrpcim_intr_enable(vxge_hal_device_h devh)
{
	u32 i;
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	vxge_hal_mrpcim_reg_t *mrpcim_reg;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	mrpcim_reg = hldev->mrpcim_reg;

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->ini_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->dma_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->tgt_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->config_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->crdt_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->mrpcim_general_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pll_errors_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->mrpcim_ppif_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->dbecc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->general_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pcipif_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pda_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pcc_error_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->lso_error_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->sm_error_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rtdma_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rc_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rxdrm_sm_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rxdcm_sm_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rxdwm_sm_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rda_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rda_ecc_db_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rqa_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->frf_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rocrc_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->wde0_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->wde1_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->wde2_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->wde3_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->wrdma_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3cmct_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3cmct_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gsscc_err_reg);

	for (i = 0; i < 3; i++) {

		VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gssc_err0_reg[i]);

		VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gssc_err1_reg[i]);

	}

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gcmg1_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gxtmc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gcp_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->cmc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->gcmg2_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3ifcmd_cml_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3ifcmd_cml_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3ifcmd_cmu_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3ifcmd_cmu_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->psscc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pcmg1_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pxtmc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->cp_exc_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->cp_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pcmg2_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->dam_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->pcmg3_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->xmac_gen_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->xgxs_gen_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->asic_ntwk_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->xgmac_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rxmac_ecc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rxmac_various_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->rxmac_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->txmac_gen_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->txmac_ecc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->tmac_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3ifcmd_fb_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3ifcmd_fb_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->mc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->grocrc_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->fau_ecc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->mc_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3fbct_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->g3fbct_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->orp_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->ptm_alarm_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->tpa_error_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->tpa_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->kdfc_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->doorbell_int_status);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->tim_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->msg_exc_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->msg_err_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->msg_err2_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->msg_err3_reg);

	VXGE_HAL_MRPCIM_ERROR_REG_CLEAR(&mrpcim_reg->msg_int_status);

	vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &mrpcim_reg->mrpcim_general_int_status);

	/* unmask interrupts */
	val64 = VXGE_HAL_INI_ERRORS_REG_DCPL_FSM_ERR |
	    VXGE_HAL_INI_ERRORS_REG_INI_BUF_DB_ERR |
	    VXGE_HAL_INI_ERRORS_REG_INI_DATA_OVERFLOW |
	    VXGE_HAL_INI_ERRORS_REG_INI_HDR_OVERFLOW;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->ini_errors_mask);

	val64 = VXGE_HAL_DMA_ERRORS_REG_RDARB_FSM_ERR |
	    VXGE_HAL_DMA_ERRORS_REG_WRARB_FSM_ERR |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_WRDMA_WR_HDR_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_WRDMA_WR_HDR_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_WRDMA_WR_DATA_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_WRDMA_WR_DATA_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_MSG_WR_HDR_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_MSG_WR_HDR_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_MSG_WR_DATA_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_MSG_WR_DATA_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_STATS_WR_HDR_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_STATS_WR_HDR_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_STATS_WR_DATA_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_STATS_WR_DATA_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_RTDMA_WR_HDR_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_RTDMA_WR_HDR_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_RTDMA_WR_DATA_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_RTDMA_WR_DATA_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_WRDMA_RD_HDR_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_WRDMA_RD_HDR_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_RTDMA_RD_HDR_OVERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DMA_RTDMA_RD_HDR_UNDERFLOW |
	    VXGE_HAL_DMA_ERRORS_REG_DBLGEN_FSM_ERR |
	    VXGE_HAL_DMA_ERRORS_REG_DBLGEN_CREDIT_FSM_ERR |
	    VXGE_HAL_DMA_ERRORS_REG_DBLGEN_DMA_WRR_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->dma_errors_mask);

	val64 = VXGE_HAL_TGT_ERRORS_REG_TGT_REQ_FSM_ERR |
	    VXGE_HAL_TGT_ERRORS_REG_TGT_CPL_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->tgt_errors_mask);

	val64 = VXGE_HAL_CONFIG_ERRORS_REG_I2C_MAIN_FSM_ERR |
	    VXGE_HAL_CONFIG_ERRORS_REG_I2C_REG_FSM_ERR |
	    VXGE_HAL_CONFIG_ERRORS_REG_CFGM_I2C_TIMEOUT |
	    VXGE_HAL_CONFIG_ERRORS_REG_RIC_I2C_TIMEOUT |
	    VXGE_HAL_CONFIG_ERRORS_REG_CFGM_FSM_ERR |
	    VXGE_HAL_CONFIG_ERRORS_REG_RIC_FSM_ERR |
	    VXGE_HAL_CONFIG_ERRORS_REG_PIFM_TIMEOUT |
	    VXGE_HAL_CONFIG_ERRORS_REG_PIFM_FSM_ERR |
	    VXGE_HAL_CONFIG_ERRORS_REG_PIFM_TO_FSM_ERR |
	    VXGE_HAL_CONFIG_ERRORS_REG_RIC_RIC_RD_TIMEOUT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->config_errors_mask);

	val64 = VXGE_HAL_CRDT_ERRORS_REG_WRCRDTARB_FSM_ERR |
	    VXGE_HAL_CRDT_ERRORS_REG_WRCRDTARB_INTCTL_ILLEGAL_CRD_DEAL |
	    VXGE_HAL_CRDT_ERRORS_REG_WRCRDTARB_PDA_ILLEGAL_CRD_DEAL |
	    VXGE_HAL_CRDT_ERRORS_REG_WRCRDTARB_PCI_MSG_ILLEGAL_CRD_DEAL |
	    VXGE_HAL_CRDT_ERRORS_REG_RDCRDTARB_FSM_ERR |
	    VXGE_HAL_CRDT_ERRORS_REG_RDCRDTARB_RDA_ILLEGAL_CRD_DEAL |
	    VXGE_HAL_CRDT_ERRORS_REG_RDCRDTARB_PDA_ILLEGAL_CRD_DEAL |
	    VXGE_HAL_CRDT_ERRORS_REG_RDCRDTARB_DBLGEN_ILLEGAL_CRD_DEAL;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->crdt_errors_mask);

	val64 = VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_STATSB_FSM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_XGEN_FSM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_XMEM_FSM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_KDFCCTL_FSM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_MRIOVCTL_FSM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_SPI_FLSH_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_SPI_IIC_ACK_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_SPI_IIC_CHKSUM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_INI_SERR_DET |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_INTCTL_MSIX_FSM_ERR |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_INTCTL_MSI_OVERFLOW |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_PPIF_PCI_NOT_FLUSH_SW_RESET |
	    VXGE_HAL_MRPCIM_GENERAL_ERRORS_REG_PPIF_SW_RESET_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->mrpcim_general_errors_mask);

	val64 = VXGE_HAL_PLL_ERRORS_REG_CORE_CMG_PLL_OOL |
	    VXGE_HAL_PLL_ERRORS_REG_CORE_FB_PLL_OOL |
	    VXGE_HAL_PLL_ERRORS_REG_CORE_X_PLL_OOL;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pll_errors_mask);

	val64 = VXGE_HAL_MRPCIM_PPIF_INT_STATUS_INI_ERRORS_INI_INT |
	    VXGE_HAL_MRPCIM_PPIF_INT_STATUS_DMA_ERRORS_DMA_INT |
	    VXGE_HAL_MRPCIM_PPIF_INT_STATUS_TGT_ERRORS_TGT_INT |
	    VXGE_HAL_MRPCIM_PPIF_INT_STATUS_CONFIG_ERRORS_CONFIG_INT |
	    VXGE_HAL_MRPCIM_PPIF_INT_STATUS_CRDT_ERRORS_CRDT_INT |
	    VXGE_HAL_MRPCIM_PPIF_INT_STATUS_MRPCIM_GENERAL_ERRORS_GENERAL_INT |
	    VXGE_HAL_MRPCIM_PPIF_INT_STATUS_PLL_ERRORS_PLL_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->mrpcim_ppif_int_mask);

	val64 = VXGE_HAL_DBECC_ERR_REG_PCI_RETRY_BUF_DB_ERR |
	    VXGE_HAL_DBECC_ERR_REG_PCI_RETRY_SOT_DB_ERR |
	    VXGE_HAL_DBECC_ERR_REG_PCI_P_HDR_DB_ERR |
	    VXGE_HAL_DBECC_ERR_REG_PCI_P_DATA_DB_ERR |
	    VXGE_HAL_DBECC_ERR_REG_PCI_NP_HDR_DB_ERR |
	    VXGE_HAL_DBECC_ERR_REG_PCI_NP_DATA_DB_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->dbecc_err_mask);

	val64 = VXGE_HAL_GENERAL_ERR_REG_PCI_LINK_RST_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->general_err_mask);

	val64 = VXGE_HAL_PCIPIF_INT_STATUS_DBECC_ERR_DBECC_ERR_INT |
	    VXGE_HAL_PCIPIF_INT_STATUS_GENERAL_ERR_GENERAL_ERR_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pcipif_int_mask);

	val64 = VXGE_HAL_PDA_ALARM_REG_PDA_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pda_alarm_mask);

	val64 = 0;

	for (i = 0; i < 8; i++) {
		val64 |= VXGE_HAL_PCC_ERROR_REG_PCC_PCC_FRM_BUF_DBE(i) |
		    VXGE_HAL_PCC_ERROR_REG_PCC_PCC_TXDO_DBE(i) |
		    VXGE_HAL_PCC_ERROR_REG_PCC_PCC_FSM_ERR_ALARM(i) |
		    VXGE_HAL_PCC_ERROR_REG_PCC_PCC_SERR(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pcc_error_mask);

	val64 = 0;

	for (i = 0; i < 8; i++) {
		val64 |= VXGE_HAL_LSO_ERROR_REG_PCC_LSO_FSM_ERR_ALARM(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->lso_error_mask);

	val64 = VXGE_HAL_SM_ERROR_REG_SM_FSM_ERR_ALARM;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->sm_error_mask);

	val64 = VXGE_HAL_RTDMA_INT_STATUS_PDA_ALARM_PDA_INT |
	    VXGE_HAL_RTDMA_INT_STATUS_PCC_ERROR_PCC_INT |
	    VXGE_HAL_RTDMA_INT_STATUS_LSO_ERROR_LSO_INT |
	    VXGE_HAL_RTDMA_INT_STATUS_SM_ERROR_SM_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rtdma_int_mask);

	val64 = VXGE_HAL_RC_ALARM_REG_FTC_SM_ERR |
	    VXGE_HAL_RC_ALARM_REG_FTC_SM_PHASE_ERR |
	    VXGE_HAL_RC_ALARM_REG_BTDWM_SM_ERR |
	    VXGE_HAL_RC_ALARM_REG_BTC_SM_ERR |
	    VXGE_HAL_RC_ALARM_REG_BTDCM_SM_ERR |
	    VXGE_HAL_RC_ALARM_REG_BTDRM_SM_ERR |
	    VXGE_HAL_RC_ALARM_REG_RMM_RXD_RC_ECC_DB_ERR |
	    VXGE_HAL_RC_ALARM_REG_RHS_RXD_RHS_ECC_DB_ERR |
	    VXGE_HAL_RC_ALARM_REG_RMM_SM_ERR |
	    VXGE_HAL_RC_ALARM_REG_BTC_VPATH_MISMATCH_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rc_alarm_mask);

	val64 = 0;

	for (i = 0; i < 17; i++) {
		val64 |= VXGE_HAL_RXDRM_SM_ERR_REG_PRC_VP(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rxdrm_sm_err_mask);

	val64 = 0;

	for (i = 0; i < 17; i++) {
		val64 |= VXGE_HAL_RXDCM_SM_ERR_REG_PRC_VP(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rxdcm_sm_err_mask);

	val64 = 0;

	for (i = 0; i < 17; i++) {
		val64 |= VXGE_HAL_RXDWM_SM_ERR_REG_PRC_VP(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rxdwm_sm_err_mask);

	val64 = VXGE_HAL_RDA_ERR_REG_RDA_SM0_ERR_ALARM |
	    VXGE_HAL_RDA_ERR_REG_RDA_RXD_ECC_DB_ERR |
	    VXGE_HAL_RDA_ERR_REG_RDA_FRM_ECC_DB_ERR |
	    VXGE_HAL_RDA_ERR_REG_RDA_UQM_ECC_DB_ERR |
	    VXGE_HAL_RDA_ERR_REG_RDA_IMM_ECC_DB_ERR |
	    VXGE_HAL_RDA_ERR_REG_RDA_TIM_ECC_DB_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rda_err_mask);

	val64 = 0;

	for (i = 0; i < 17; i++) {
		val64 |= VXGE_HAL_RDA_ECC_DB_REG_RDA_RXD_ERR(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rda_ecc_db_mask);

	val64 = VXGE_HAL_RQA_ERR_REG_RQA_SM_ERR_ALARM;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rqa_err_mask);

	val64 = 0;

	for (i = 0; i < 17; i++) {
		val64 |= VXGE_HAL_FRF_ALARM_REG_PRC_VP_FRF_SM_ERR(i);
	}

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->frf_alarm_mask);

	val64 = VXGE_HAL_ROCRC_ALARM_REG_QCQ_QCC_BYP_ECC_DB |
	    VXGE_HAL_ROCRC_ALARM_REG_NOA_NMA_SM_ERR |
	    VXGE_HAL_ROCRC_ALARM_REG_NOA_IMMM_ECC_DB |
	    VXGE_HAL_ROCRC_ALARM_REG_UDQ_UMQM_ECC_DB |
	    VXGE_HAL_ROCRC_ALARM_REG_NOA_RCBM_ECC_DB |
	    VXGE_HAL_ROCRC_ALARM_REG_NOA_WCT_CMD_FIFO_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rocrc_alarm_mask);

	val64 = VXGE_HAL_WDE0_ALARM_REG_WDE0_DCC_SM_ERR |
	    VXGE_HAL_WDE0_ALARM_REG_WDE0_PRM_SM_ERR |
	    VXGE_HAL_WDE0_ALARM_REG_WDE0_CP_SM_ERR |
	    VXGE_HAL_WDE0_ALARM_REG_WDE0_CP_CMD_ERR |
	    VXGE_HAL_WDE0_ALARM_REG_WDE0_PCR_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->wde0_alarm_mask);

	val64 = VXGE_HAL_WDE1_ALARM_REG_WDE1_DCC_SM_ERR |
	    VXGE_HAL_WDE1_ALARM_REG_WDE1_PRM_SM_ERR |
	    VXGE_HAL_WDE1_ALARM_REG_WDE1_CP_SM_ERR |
	    VXGE_HAL_WDE1_ALARM_REG_WDE1_CP_CMD_ERR |
	    VXGE_HAL_WDE1_ALARM_REG_WDE1_PCR_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->wde1_alarm_mask);

	val64 = VXGE_HAL_WDE2_ALARM_REG_WDE2_DCC_SM_ERR |
	    VXGE_HAL_WDE2_ALARM_REG_WDE2_PRM_SM_ERR |
	    VXGE_HAL_WDE2_ALARM_REG_WDE2_CP_SM_ERR |
	    VXGE_HAL_WDE2_ALARM_REG_WDE2_CP_CMD_ERR |
	    VXGE_HAL_WDE2_ALARM_REG_WDE2_PCR_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->wde2_alarm_mask);

	val64 = VXGE_HAL_WDE3_ALARM_REG_WDE3_DCC_SM_ERR |
	    VXGE_HAL_WDE3_ALARM_REG_WDE3_PRM_SM_ERR |
	    VXGE_HAL_WDE3_ALARM_REG_WDE3_CP_SM_ERR |
	    VXGE_HAL_WDE3_ALARM_REG_WDE3_CP_CMD_ERR |
	    VXGE_HAL_WDE3_ALARM_REG_WDE3_PCR_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->wde3_alarm_mask);

	val64 = VXGE_HAL_WRDMA_INT_STATUS_RC_ALARM_RC_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_RXDRM_SM_ERR_RXDRM_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_RXDCM_SM_ERR_RXDCM_SM_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_RXDWM_SM_ERR_RXDWM_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_RDA_ERR_RDA_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_RDA_ECC_DB_RDA_ECC_DB_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_FRF_ALARM_FRF_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_ROCRC_ALARM_ROCRC_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_WDE0_ALARM_WDE0_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_WDE1_ALARM_WDE1_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_WDE2_ALARM_WDE2_INT |
	    VXGE_HAL_WRDMA_INT_STATUS_WDE3_ALARM_WDE3_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->wrdma_int_mask);

	val64 = VXGE_HAL_G3CMCT_ERR_REG_G3IF_SM_ERR |
	    VXGE_HAL_G3CMCT_ERR_REG_G3IF_GDDR3_DECC |
	    VXGE_HAL_G3CMCT_ERR_REG_G3IF_GDDR3_U_DECC |
	    VXGE_HAL_G3CMCT_ERR_REG_G3IF_CTRL_FIFO_DECC;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->g3cmct_err_mask);

	val64 = VXGE_HAL_G3CMCT_INT_STATUS_ERR_G3IF_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->g3cmct_int_mask);

	val64 = VXGE_HAL_GSSCC_ERR_REG_SSCC_SSR_DB_ERR(0x3) |
	    VXGE_HAL_GSSCC_ERR_REG_SSCC_TSR_DB_ERR(0x3f) |
	    VXGE_HAL_GSSCC_ERR_REG_SSCC_CP2STE_UFLOW_ERR |
	    VXGE_HAL_GSSCC_ERR_REG_SSCC_CP2TTE_UFLOW_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->gsscc_err_mask);

	for (i = 0; i < 3; i++) {

		val64 = VXGE_HAL_GSSC_ERR0_REG_SSCC_STATE_DB_ERR(0xff) |
		    VXGE_HAL_GSSC_ERR0_REG_SSCC_CM_RESP_DB_ERR(0xf) |
		    VXGE_HAL_GSSC_ERR0_REG_SSCC_SSR_RESP_DB_ERR(0x3) |
		    VXGE_HAL_GSSC_ERR0_REG_SSCC_TSR_RESP_DB_ERR(0x3f);

		VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
		    &mrpcim_reg->gssc_err0_mask[i]);

		val64 = VXGE_HAL_GSSC_ERR1_REG_SSCC_CM_RESP_DB_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SCREQ_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_CM_RESP_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_CM_RESP_R_WN_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_CM_RESP_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_CM_REQ_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_CM_REQ_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_FSM_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_FSM_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SSR_REQ_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SSR_REQ_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SSR_RESP_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SSR_RESP_R_WN_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SSR_RESP_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_TSR_REQ_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_TSR_REQ_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_TSR_RESP_OFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_TSR_RESP_R_WN_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_TSR_RESP_UFLOW_ERR |
		    VXGE_HAL_GSSC_ERR1_REG_SSCC_SCRESP_ERR;

		VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
		    &mrpcim_reg->gssc_err1_mask[i]);

	}

	val64 = VXGE_HAL_GCMG1_INT_STATUS_GSSCC_ERR_GSSCC_INT |
	    VXGE_HAL_GCMG1_INT_STATUS_GSSC0_ERR0_GSSC0_0_INT |
	    VXGE_HAL_GCMG1_INT_STATUS_GSSC0_ERR1_GSSC0_1_INT |
	    VXGE_HAL_GCMG1_INT_STATUS_GSSC1_ERR0_GSSC1_0_INT |
	    VXGE_HAL_GCMG1_INT_STATUS_GSSC1_ERR1_GSSC1_1_INT |
	    VXGE_HAL_GCMG1_INT_STATUS_GSSC2_ERR0_GSSC2_0_INT |
	    VXGE_HAL_GCMG1_INT_STATUS_GSSC2_ERR1_GSSC2_1_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->gcmg1_int_mask);

	val64 = VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_MEM_DB_ERR(0xf) |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMC_RD_DATA_DB_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_REQ_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_REQ_DATA_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_WR_RSP_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_RD_RSP_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_WRP_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_WRP_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_RRP_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_RRP_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_DATA_SM_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_CMC0_IF_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_CFC_SM_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_DFETCH_CREDIT_OVERFLOW |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_DFETCH_CREDIT_UNDERFLOW |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_DFETCH_SM_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_RCTRL_CREDIT_OVERFLOW |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_RCTRL_CREDIT_UNDERFLOW |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_RCTRL_SM_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_WCOMPL_SM_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_WCOMPL_TAG_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_WREQ_SM_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_BDT_CMI_WREQ_FIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CP2BDT_RFIFO_POP_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_XTMC_BDT_CMI_OP_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_XTMC_BDT_DFETCH_OP_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_XTMC_BDT_DFIFO_ERR |
	    VXGE_HAL_GXTMC_ERR_REG_XTMC_CMI_ARB_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->gxtmc_err_mask);

	val64 = VXGE_HAL_GCP_ERR_REG_CP_H2L2CP_FIFO_ERR |
	    VXGE_HAL_GCP_ERR_REG_CP_STC2CP_FIFO_ERR |
	    VXGE_HAL_GCP_ERR_REG_CP_STE2CP_FIFO_ERR |
	    VXGE_HAL_GCP_ERR_REG_CP_TTE2CP_FIFO_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->gcp_err_mask);

	val64 = VXGE_HAL_CMC_ERR_REG_CMC_CMC_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->cmc_err_mask);

	val64 = VXGE_HAL_GCMG2_INT_STATUS_GXTMC_ERR_GXTMC_INT |
	    VXGE_HAL_GCMG2_INT_STATUS_GCP_ERR_GCP_INT |
	    VXGE_HAL_GCMG2_INT_STATUS_CMC_ERR_CMC_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->gcmg2_int_mask);

	val64 = VXGE_HAL_G3IFCMD_CML_ERR_REG_G3IF_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->g3ifcmd_cml_err_mask);

	val64 = VXGE_HAL_G3IFCMD_CML_INT_STATUS_ERR_G3IF_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->g3ifcmd_cml_int_mask);

	val64 = VXGE_HAL_G3IFCMD_CMU_ERR_REG_G3IF_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->g3ifcmd_cmu_err_mask);

	val64 = VXGE_HAL_G3IFCMD_CMU_INT_STATUS_ERR_G3IF_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->g3ifcmd_cmu_int_mask);

	val64 = VXGE_HAL_PSSCC_ERR_REG_SSCC_CP2STE_OFLOW_ERR |
	    VXGE_HAL_PSSCC_ERR_REG_SSCC_CP2TTE_OFLOW_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->psscc_err_mask);

	val64 = VXGE_HAL_PCMG1_INT_STATUS_PSSCC_ERR_PSSCC_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->pcmg1_int_mask);

	val64 = VXGE_HAL_PXTMC_ERR_REG_XTMC_XT_PIF_SRAM_DB_ERR(0x3) |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_REQ_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_PRSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_WRSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_REQ_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_PRSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_WRSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_REQ_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_PRSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_WRSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_REQ_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_REQ_DATA_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_WR_RSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_RD_RSP_FIFO_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_REQ_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_RSP_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_REQ_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_RSP_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_REQ_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_RSP_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_XIL_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_ARB_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_RAM_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CMW_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CMR_SHADOW_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_REQ_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MPT_RSP_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_REQ_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UPT_RSP_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_REQ_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CPT_RSP_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_XIL_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_ARB_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CMW_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CMR_FSM_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MXP_RD_PROT_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UXP_RD_PROT_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CXP_RD_PROT_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MXP_WR_PROT_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UXP_WR_PROT_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CXP_WR_PROT_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_MXP_INV_ADDR_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_UXP_INV_ADDR_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CXP_INV_ADDR_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CP2BDT_DFIFO_PUSH_ERR |
	    VXGE_HAL_PXTMC_ERR_REG_XTMC_CP2BDT_RFIFO_PUSH_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pxtmc_err_mask);

	val64 = VXGE_HAL_CP_EXC_REG_CP_CP_CAUSE_CRIT_INT |
	    VXGE_HAL_CP_EXC_REG_CP_CP_SERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->cp_exc_mask);

	val64 = VXGE_HAL_CP_ERR_REG_CP_CP_DCACHE_DB_ERR(0xff) |
	    VXGE_HAL_CP_ERR_REG_CP_CP_ICACHE_DB_ERR(0x3) |
	    VXGE_HAL_CP_ERR_REG_CP_CP_DTAG_DB_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_CP_ITAG_DB_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_CP_TRACE_DB_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_DMA2CP_DB_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_MP2CP_DB_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_QCC2CP_DB_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_STC2CP_DB_ERR(0x3) |
	    VXGE_HAL_CP_ERR_REG_CP_H2L2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_STC2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_STE2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_TTE2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_SWIF2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_CP2DMA_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_DAM2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_MP2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_QCC2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_DMA2CP_FIFO_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_CP_WAKE_FSM_INTEGRITY_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_CP_PMON_FSM_INTEGRITY_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_DMA_RD_SHADOW_ERR |
	    VXGE_HAL_CP_ERR_REG_CP_PIFT_CREDIT_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->cp_err_mask);

	val64 = VXGE_HAL_PCMG2_INT_STATUS_PXTMC_ERR_PXTMC_INT |
	    VXGE_HAL_PCMG2_INT_STATUS_CP_EXC_CP_XT_EXC_INT |
	    VXGE_HAL_PCMG2_INT_STATUS_CP_ERR_CP_ERR_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pcmg2_int_mask);

	val64 = VXGE_HAL_DAM_ERR_REG_DAM_RDSB_ECC_DB_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_WRSB_ECC_DB_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_HPPEDAT_ECC_DB_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_LPPEDAT_ECC_DB_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_WRRESP_ECC_DB_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_HPRD_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_LPRD_0_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_LPRD_1_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_HPPEDAT_OVERFLOW_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_LPPEDAT_OVERFLOW_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_WRRESP_OVERFLOW_ERR |
	    VXGE_HAL_DAM_ERR_REG_DAM_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->dam_err_mask);

	val64 = VXGE_HAL_PCMG3_INT_STATUS_DAM_ERR_DAM_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->pcmg3_int_mask);

	val64 = VXGE_HAL_XMAC_GEN_ERR_REG_XSTATS_RMAC_STATS_TILE0_DB_ERR(0x3) |
	    VXGE_HAL_XMAC_GEN_ERR_REG_XSTATS_RMAC_STATS_TILE1_DB_ERR(0x3) |
	    VXGE_HAL_XMAC_GEN_ERR_REG_XSTATS_RMAC_STATS_TILE2_DB_ERR(0x3) |
	    VXGE_HAL_XMAC_GEN_ERR_REG_XSTATS_RMAC_STATS_TILE3_DB_ERR(0x3) |
	    VXGE_HAL_XMAC_GEN_ERR_REG_XSTATS_RMAC_STATS_TILE4_DB_ERR(0x3) |
	    VXGE_HAL_XMAC_GEN_ERR_REG_XMACJ_XMAC_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->xmac_gen_err_mask);

	val64 = VXGE_HAL_XGXS_GEN_ERR_REG_XGXS_XGXS_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->xgxs_gen_err_mask);

	val64 = VXGE_HAL_ASIC_NTWK_ERR_REG_XMACJ_NTWK_DOWN |
	    VXGE_HAL_ASIC_NTWK_ERR_REG_XMACJ_NTWK_UP |
	    VXGE_HAL_ASIC_NTWK_ERR_REG_XMACJ_NTWK_WENT_DOWN |
	    VXGE_HAL_ASIC_NTWK_ERR_REG_XMACJ_NTWK_WENT_UP |
	    VXGE_HAL_ASIC_NTWK_ERR_REG_XMACJ_NTWK_REAFFIRMED_FAULT |
	    VXGE_HAL_ASIC_NTWK_ERR_REG_XMACJ_NTWK_REAFFIRMED_OK;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->asic_ntwk_err_mask);

	val64 = VXGE_HAL_XGMAC_INT_STATUS_XMAC_GEN_ERR_XMAC_GEN_INT |
	    VXGE_HAL_XGMAC_INT_STATUS_XGXS_GEN_ERR_XGXS_GEN_INT |
	    VXGE_HAL_XGMAC_INT_STATUS_ASIC_NTWK_ERR_ASIC_NTWK_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->xgmac_int_mask);

	val64 =
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RMAC_PORT0_RMAC_RTS_PART_DB_ERR(0xf) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RMAC_PORT1_RMAC_RTS_PART_DB_ERR(0xf) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RMAC_PORT2_RMAC_RTS_PART_DB_ERR(0xf) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_DA_LKP_PRT0_DB_ERR(0x3) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_DA_LKP_PRT1_DB_ERR(0x3) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_VID_LKP_DB_ERR |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_PN_LKP_PRT0_DB_ERR |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_PN_LKP_PRT1_DB_ERR |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_PN_LKP_PRT2_DB_ERR |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_RTH_MASK_DB_ERR(0x3f) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_RTH_LKP_DB_ERR(0x7) |
	    VXGE_HAL_RXMAC_ECC_ERR_REG_RTSJ_RMAC_DS_LKP_DB_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->rxmac_ecc_err_mask);

	val64 = VXGE_HAL_RXMAC_VARIOUS_ERR_REG_RMAC_RMAC_PORT0_FSM_ERR |
	    VXGE_HAL_RXMAC_VARIOUS_ERR_REG_RMAC_RMAC_PORT1_FSM_ERR |
	    VXGE_HAL_RXMAC_VARIOUS_ERR_REG_RMAC_RMAC_PORT2_FSM_ERR |
	    VXGE_HAL_RXMAC_VARIOUS_ERR_REG_RMACJ_RMACJ_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->rxmac_various_err_mask);

	val64 = VXGE_HAL_RXMAC_INT_STATUS_RXMAC_ECC_ERR_RXMAC_ECC_INT |
	    VXGE_HAL_RXMAC_INT_STATUS_RXMAC_VARIOUS_ERR_RXMAC_VARIOUS_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->rxmac_int_mask);

	val64 = VXGE_HAL_TXMAC_GEN_ERR_REG_TMACJ_PERMANENT_STOP;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->txmac_gen_err_mask);

	val64 = VXGE_HAL_TXMAC_ECC_ERR_REG_TMACJ_TMAC_TPA2MAC_DB_ERR |
	    VXGE_HAL_TXMAC_ECC_ERR_REG_TMACJ_TMAC_TPA2M_SB_DB_ERR |
	    VXGE_HAL_TXMAC_ECC_ERR_REG_TMACJ_TMAC_TPA2M_DA_DB_ERR |
	    VXGE_HAL_TXMAC_ECC_ERR_REG_TMAC_TMAC_PORT0_FSM_ERR |
	    VXGE_HAL_TXMAC_ECC_ERR_REG_TMAC_TMAC_PORT1_FSM_ERR |
	    VXGE_HAL_TXMAC_ECC_ERR_REG_TMAC_TMAC_PORT2_FSM_ERR |
	    VXGE_HAL_TXMAC_ECC_ERR_REG_TMACJ_TMACJ_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->txmac_ecc_err_mask);

	val64 = VXGE_HAL_TMAC_INT_STATUS_TXMAC_GEN_ERR_TXMAC_GEN_INT |
	    VXGE_HAL_TMAC_INT_STATUS_TXMAC_ECC_ERR_TXMAC_ECC_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->tmac_int_mask);

	val64 = VXGE_HAL_G3IFCMD_FB_ERR_REG_G3IF_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->g3ifcmd_fb_err_mask);

	val64 = VXGE_HAL_G3IFCMD_FB_INT_STATUS_ERR_G3IF_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64,
	    &mrpcim_reg->g3ifcmd_fb_int_mask);

	val64 = VXGE_HAL_MC_ERR_REG_MC_XFMD_MEM_ECC_DB_ERR_A |
	    VXGE_HAL_MC_ERR_REG_MC_XFMD_MEM_ECC_DB_ERR_B |
	    VXGE_HAL_MC_ERR_REG_MC_G3IF_RD_FIFO_ECC_DB_ERR |
	    VXGE_HAL_MC_ERR_REG_MC_MIRI_ECC_DB_ERR_0 |
	    VXGE_HAL_MC_ERR_REG_MC_MIRI_ECC_DB_ERR_1 |
	    VXGE_HAL_MC_ERR_REG_MC_SM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->mc_err_mask);

	val64 = VXGE_HAL_GROCRC_ALARM_REG_XFMD_WR_FIFO_ERR |
	    VXGE_HAL_GROCRC_ALARM_REG_WDE2MSR_RD_FIFO_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->grocrc_alarm_mask);

	val64 = VXGE_HAL_FAU_ECC_ERR_REG_FAU_PORT0_FAU_MAC2F_N_DB_ERR |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAU_PORT0_FAU_MAC2F_W_DB_ERR(0x3) |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAU_PORT1_FAU_MAC2F_N_DB_ERR |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAU_PORT1_FAU_MAC2F_W_DB_ERR(0x3) |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAU_PORT2_FAU_MAC2F_N_DB_ERR |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAU_PORT2_FAU_MAC2F_W_DB_ERR(0x3) |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAU_FAU_XFMD_INS_DB_ERR(0x3) |
	    VXGE_HAL_FAU_ECC_ERR_REG_FAUJ_FAU_FSM_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->fau_ecc_err_mask);

	val64 = VXGE_HAL_MC_INT_STATUS_MC_ERR_MC_INT |
	    VXGE_HAL_MC_INT_STATUS_GROCRC_ALARM_ROCRC_INT |
	    VXGE_HAL_MC_INT_STATUS_FAU_ECC_ERR_FAU_ECC_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->mc_int_mask);

	val64 = VXGE_HAL_G3FBCT_ERR_REG_G3IF_SM_ERR |
	    VXGE_HAL_G3FBCT_ERR_REG_G3IF_GDDR3_DECC |
	    VXGE_HAL_G3FBCT_ERR_REG_G3IF_GDDR3_U_DECC |
	    VXGE_HAL_G3FBCT_ERR_REG_G3IF_CTRL_FIFO_DECC;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->g3fbct_err_mask);

	val64 = VXGE_HAL_G3FBCT_INT_STATUS_ERR_G3IF_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->g3fbct_int_mask);

	val64 = VXGE_HAL_ORP_ERR_REG_ORP_FIFO_DB_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_XFMD_FIFO_UFLOW_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_FRM_FIFO_UFLOW_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_XFMD_RCV_FSM_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_OUTREAD_FSM_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_OUTQEM_FSM_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_XFMD_RCV_SHADOW_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_OUTREAD_SHADOW_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_OUTQEM_SHADOW_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_OUTFRM_SHADOW_ERR |
	    VXGE_HAL_ORP_ERR_REG_ORP_OPTPRS_SHADOW_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->orp_err_mask);

	val64 = VXGE_HAL_PTM_ALARM_REG_PTM_RDCTRL_SYNC_ERR |
	    VXGE_HAL_PTM_ALARM_REG_PTM_RDCTRL_FIFO_ERR |
	    VXGE_HAL_PTM_ALARM_REG_XFMD_RD_FIFO_ERR |
	    VXGE_HAL_PTM_ALARM_REG_WDE2MSR_WR_FIFO_ERR |
	    VXGE_HAL_PTM_ALARM_REG_PTM_FRMM_ECC_DB_ERR(0x3);

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->ptm_alarm_mask);

	val64 = VXGE_HAL_TPA_ERROR_REG_TPA_FSM_ERR_ALARM |
	    VXGE_HAL_TPA_ERROR_REG_TPA_TPA_DA_LKUP_PRT0_DB_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->tpa_error_mask);

	val64 = VXGE_HAL_TPA_INT_STATUS_ORP_ERR_ORP_INT |
	    VXGE_HAL_TPA_INT_STATUS_PTM_ALARM_PTM_INT |
	    VXGE_HAL_TPA_INT_STATUS_TPA_ERROR_TPA_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->tpa_int_mask);

	val64 = VXGE_HAL_KDFC_ERR_REG_KDFC_KDFC_ECC_DB_ERR |
	    VXGE_HAL_KDFC_ERR_REG_KDFC_KDFC_SM_ERR_ALARM;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->kdfc_err_mask);

	val64 = VXGE_HAL_DOORBELL_INT_STATUS_KDFC_ERR_REG_TXDMA_KDFC_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->doorbell_int_mask);

	val64 = VXGE_HAL_TIM_ERR_REG_TIM_VBLS_DB_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_BMAP_PA_DB_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_BMAP_PB_DB_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_BMAP_MSG_DB_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_BMAP_MEM_CNTRL_SM_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_BMAP_MSG_MEM_CNTRL_SM_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_MPIF_PCIWR_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_ROCRC_BMAP_UPDT_FIFO_ERR |
	    VXGE_HAL_TIM_ERR_REG_TIM_CREATE_BMAPMSG_FIFO_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->tim_err_mask);

	val64 = VXGE_HAL_MSG_EXC_REG_MP_MXP_CAUSE_CRIT_INT |
	    VXGE_HAL_MSG_EXC_REG_UP_UXP_CAUSE_CRIT_INT |
	    VXGE_HAL_MSG_EXC_REG_MP_MXP_SERR |
	    VXGE_HAL_MSG_EXC_REG_UP_UXP_SERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->msg_exc_mask);

	val64 = VXGE_HAL_MSG_ERR_REG_UP_UXP_WAKE_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MP_MXP_WAKE_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_DMQ_DMA_READ_CMD_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_DMQ_DMA_RESP_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_DMQ_OWN_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_PDA_ACC_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MP_MXP_PMON_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_UP_UXP_PMON_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_XFMDQRY_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_FRMQRY_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_UMQ_WRITE_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_UMQ_BWR_PF_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_REG_RESP_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_UP_UXP_DTAG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_UP_UXP_ITAG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MP_MXP_DTAG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MP_MXP_ITAG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_UP_UXP_TRACE_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MP_MXP_TRACE_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_CMG2MSG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_TXPE2MSG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_RXPE2MSG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_RPE2MSG_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_REG_READ_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_MXP2UXP_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_KDFC_SIF_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_CXP2SWIF_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_UMQ_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_BWR_PF_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_BWR_SIF_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_DMQ_ECC_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_DMA_READ_FIFO_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_DMA_RESP_ECC_DB_ERR |
	    VXGE_HAL_MSG_ERR_REG_MSG_QUE_UXP2MXP_FIFO_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->msg_err_mask);

	val64 =
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_CMG2MSG_DISPATCH_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_DMQ_DISPATCH_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_SWIF_DISPATCH_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_PIC_WRITE_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_SWIFREG_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_TIM_WRITE_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_UMQ_TA_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_TXPE_TA_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_RXPE_TA_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_SWIF_TA_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_DMA_TA_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_CP_TA_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA16_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA15_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA14_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA13_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA12_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA11_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA10_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA9_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA8_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA7_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA6_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA5_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA4_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA3_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA2_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA1_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_LONGTERMUMQ_TA0_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_FBMC_OWN_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_TXPE2MSG_DISPATCH_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_RXPE2MSG_DISPATCH_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_RPE2MSG_DISPATCH_FSM_INTEGRITY_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MP_MP_PIFT_IF_CREDIT_CNT_ERR |
	    VXGE_HAL_MSG_ERR2_REG_UP_UP_PIFT_IF_CREDIT_CNT_ERR |
	    VXGE_HAL_MSG_ERR2_REG_MSG_QUE_UMQ2PIC_CMD_FIFO_ERR |
	    VXGE_HAL_MSG_ERR2_REG_TIM_TIM2MSG_CMD_FIFO_ERR;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->msg_err2_mask);

	val64 = VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR0 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR1 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR2 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR3 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR4 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR5 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR6 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_DCACHE_DB_ERR7 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_ICACHE_DB_ERR0 |
	    VXGE_HAL_MSG_ERR3_REG_UP_UXP_ICACHE_DB_ERR1 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR0 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR1 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR2 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR3 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR4 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR5 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR6 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_DCACHE_DB_ERR7 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_ICACHE_DB_ERR0 |
	    VXGE_HAL_MSG_ERR3_REG_MP_MXP_ICACHE_DB_ERR1;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->msg_err3_mask);

	val64 = VXGE_HAL_MSG_INT_STATUS_TIM_ERR_TIM_INT |
	    VXGE_HAL_MSG_INT_STATUS_MSG_EXC_MSG_XT_EXC_INT |
	    VXGE_HAL_MSG_INT_STATUS_MSG_ERR3_MSG_ERR3_INT |
	    VXGE_HAL_MSG_INT_STATUS_MSG_ERR2_MSG_ERR2_INT |
	    VXGE_HAL_MSG_INT_STATUS_MSG_ERR_MSG_ERR_INT;

	VXGE_HAL_MRPCIM_ERROR_REG_UNMASK(val64, &mrpcim_reg->msg_int_mask);

	val64 = VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_PIC_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_PCI_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_RTDMA_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_WRDMA_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_G3CMCT_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_GCMG1_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_GCMG2_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_G3CMIFL_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_G3CMIFU_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_PCMG1_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_PCMG2_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_PCMG3_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_XMAC_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_RXMAC_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_TMAC_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_G3FBIF_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_FBMC_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_G3FBCT_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_TPA_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_DRBELL_INT |
	    VXGE_HAL_MRPCIM_GENERAL_INT_STATUS_MSG_INT;

	vxge_hal_pio_mem_write32_upper(
	    hldev->header.pdev,
	    hldev->header.regh0,
	    (u32) bVAL32(~val64, 0),
	    &mrpcim_reg->mrpcim_general_int_mask);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * vxge_hal_mrpcim_intr_disable - Disable the interrupts on mrpcim.
 * @devh: HAL device handle.
 *
 * Disable mrpcim interrupts
 *
 * See also: vxge_hal_mrpcim_intr_enable().
 */
vxge_hal_status_e
vxge_hal_mrpcim_intr_disable(vxge_hal_device_h devh)
{
	u32 i;
	vxge_hal_status_e status = VXGE_HAL_OK;
	vxge_hal_mrpcim_reg_t *mrpcim_reg;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	mrpcim_reg = hldev->mrpcim_reg;

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->ini_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->dma_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->tgt_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->config_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->crdt_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->mrpcim_general_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pll_errors_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->mrpcim_ppif_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->dbecc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->general_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pcipif_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pda_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pcc_error_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->lso_error_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->sm_error_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rtdma_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rc_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rxdrm_sm_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rxdcm_sm_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rxdwm_sm_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rda_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rda_ecc_db_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rqa_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->frf_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rocrc_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->wde0_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->wde1_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->wde2_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->wde3_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->wrdma_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3cmct_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3cmct_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gsscc_err_mask);

	for (i = 0; i < 3; i++) {

		VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gssc_err0_mask[i]);

		VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gssc_err1_mask[i]);

	}

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gcmg1_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gxtmc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gcp_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->cmc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->gcmg2_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3ifcmd_cml_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3ifcmd_cml_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3ifcmd_cmu_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3ifcmd_cmu_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->psscc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pcmg1_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pxtmc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->cp_exc_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->cp_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pcmg2_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->dam_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->pcmg3_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->xmac_gen_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->xgxs_gen_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->asic_ntwk_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->xgmac_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rxmac_ecc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rxmac_various_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->rxmac_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->txmac_gen_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->txmac_ecc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->tmac_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3ifcmd_fb_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3ifcmd_fb_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->mc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->grocrc_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->fau_ecc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->mc_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3fbct_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->g3fbct_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->orp_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->ptm_alarm_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->tpa_error_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->tpa_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->kdfc_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->doorbell_int_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->tim_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->msg_exc_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->msg_err_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->msg_err2_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->msg_err3_mask);

	VXGE_HAL_MRPCIM_ERROR_REG_MASK(&mrpcim_reg->msg_int_mask);

	vxge_hal_pio_mem_write32_upper(
	    hldev->header.pdev,
	    hldev->header.regh0,
	    (u32) VXGE_HAL_INTR_MASK_ALL,
	    &mrpcim_reg->mrpcim_general_int_mask);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * vxge_hal_mrpcim_reset - Reset the entire device.
 * @devh: HAL device handle.
 *
 * Soft-reset the device, reset the device stats except reset_cnt.
 *
 *
 * Returns:  VXGE_HAL_OK - success.
 * VXGE_HAL_ERR_DEVICE_NOT_INITIALIZED - Device is not initialized.
 * VXGE_HAL_ERR_RESET_FAILED - Reset failed.
 *
 * See also: vxge_hal_status_e {}.
 */
vxge_hal_status_e
vxge_hal_mrpcim_reset(vxge_hal_device_h devh)
{
	u64 val64;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	if (!hldev->header.is_initialized)
		return (VXGE_HAL_ERR_DEVICE_NOT_INITIALIZED);

	if (hldev->device_resetting == 1) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_RESET_IN_PROGRESS);

		return (VXGE_HAL_ERR_RESET_IN_PROGRESS);
	}

	(void) __hal_ifmsg_wmsg_post(hldev,
	    hldev->first_vp_id,
	    VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
	    VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_DEVICE_RESET_BEGIN,
	    0);

	vxge_os_mdelay(100);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->sw_reset_cfg1);

	val64 |= VXGE_HAL_SW_RESET_CFG1_TYPE;

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->sw_reset_cfg1);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    VXGE_HAL_PF_SW_RESET_PF_SW_RESET(
	    VXGE_HAL_PF_SW_RESET_COMMAND),
	    &hldev->mrpcim_reg->bf_sw_reset);

	hldev->stats.sw_dev_info_stats.soft_reset_cnt++;

	hldev->device_resetting = 1;

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, VXGE_HAL_PENDING);

	return (VXGE_HAL_PENDING);
}

/*
 * vxge_hal_mrpcim_reset_poll - Poll the device for reset complete.
 * @devh: HAL device handle.
 *
 * Soft-reset the device, reset the device stats except reset_cnt.
 *
 * After reset is done, will try to re-initialize HW.
 *
 * Returns:  VXGE_HAL_OK - success.
 * VXGE_HAL_ERR_DEVICE_NOT_INITIALIZED - Device is not initialized.
 * VXGE_HAL_ERR_RESET_FAILED - Reset failed.
 *
 * See also: vxge_hal_status_e {}.
 */
vxge_hal_status_e
vxge_hal_mrpcim_reset_poll(vxge_hal_device_h devh)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d", __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	if (!hldev->header.is_initialized) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_DEVICE_NOT_INITIALIZED);
		return (VXGE_HAL_ERR_DEVICE_NOT_INITIALIZED);
	}

	if ((status = __hal_device_reg_addr_get(hldev)) != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		hldev->device_resetting = 0;
		return (status);
	}

	__hal_device_id_get(hldev);

	__hal_device_host_info_get(hldev);

	hldev->hw_is_initialized = 0;

	hldev->device_resetting = 0;

	vxge_os_memzero(hldev->mrpcim->mrpcim_stats,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	vxge_os_memzero(&hldev->mrpcim->mrpcim_stats_sav,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	status = __hal_mrpcim_mac_configure(hldev);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	status = __hal_mrpcim_lag_configure(hldev);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mdio_gen_cfg_port[0]);

	hldev->mrpcim->mdio_phy_prtad0 =
	    (u32) VXGE_HAL_MDIO_GEN_CFG_PORT_GET_MDIO_PHY_PRTAD(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mdio_gen_cfg_port[1]);

	hldev->mrpcim->mdio_phy_prtad1 =
	    (u32) VXGE_HAL_MDIO_GEN_CFG_PORT_GET_MDIO_PHY_PRTAD(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->xgxs_static_cfg_port[0]);

	hldev->mrpcim->mdio_dte_prtad0 =
	    (u32) VXGE_HAL_XGXS_STATIC_CFG_PORT_GET_MDIO_DTE_PRTAD(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->xgxs_static_cfg_port[1]);

	hldev->mrpcim->mdio_dte_prtad1 =
	    (u32) VXGE_HAL_XGXS_STATIC_CFG_PORT_GET_MDIO_DTE_PRTAD(val64);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    hldev->mrpcim->mrpcim_stats_block->dma_addr,
	    &hldev->mrpcim_reg->mrpcim_stats_start_host_addr);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    hldev->vpath_assignments,
	    &hldev->mrpcim_reg->rxmac_authorize_all_addr);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    hldev->vpath_assignments,
	    &hldev->mrpcim_reg->rxmac_authorize_all_vid);

	(void) __hal_ifmsg_wmsg_post(hldev,
	    hldev->first_vp_id,
	    VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
	    VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_DEVICE_RESET_END,
	    0);

	(void) vxge_hal_device_reset_poll(devh);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * __hal_mrpcim_xpak_counter_check -  check the Xpak error count and log the msg
 * @hldev: pointer to __hal_device_t structure
 * @port: Port number
 * @type:  xpak stats error type
 * @value: xpak stats value
 *
 * It is used to log the error message based on the xpak stats value
 * Return value:
 * None
 */
void
__hal_mrpcim_xpak_counter_check(__hal_device_t *hldev,
    u32 port, u32 type, u32 value)
{
	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats(
	    "hldev = 0x"VXGE_OS_STXFMT", port = %d, type = %d, value = %d",
	    (ptr_t) hldev, port, type, value);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

		vxge_hal_trace_log_stats("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__,
		    __LINE__, VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return;

	}

	/*
	 * If the value is high for three consecutive cylce,
	 * log a error message
	 */
	if (value == 3) {
		switch (type) {
		case VXGE_HAL_XPAK_ALARM_EXCESS_TEMP:
			hldev->mrpcim->xpak_stats[port].excess_temp = 0;

			/*
			 * Notify the ULD on Excess Xpak temperature alarm msg
			 */
			if (g_vxge_hal_driver->uld_callbacks.xpak_alarm_log) {
				g_vxge_hal_driver->uld_callbacks.xpak_alarm_log(
				    hldev->header.upper_layer_data,
				    port,
				    VXGE_HAL_XPAK_ALARM_EXCESS_TEMP);
			}
			break;
		case VXGE_HAL_XPAK_ALARM_EXCESS_BIAS_CURRENT:
			hldev->mrpcim->xpak_stats[port].excess_bias_current = 0;

			/*
			 * Notify the ULD on Excess  xpak bias current alarm msg
			 */
			if (g_vxge_hal_driver->uld_callbacks.xpak_alarm_log) {
				g_vxge_hal_driver->uld_callbacks.xpak_alarm_log(
				    hldev->header.upper_layer_data,
				    port,
				    VXGE_HAL_XPAK_ALARM_EXCESS_BIAS_CURRENT);
			}
			break;
		case VXGE_HAL_XPAK_ALARM_EXCESS_LASER_OUTPUT:
			hldev->mrpcim->xpak_stats[port].excess_laser_output = 0;

			/*
			 * Notify the ULD on Excess Xpak Laser o/p power
			 * alarm msg
			 */
			if (g_vxge_hal_driver->uld_callbacks.xpak_alarm_log) {
				g_vxge_hal_driver->uld_callbacks.xpak_alarm_log(
				    hldev->header.upper_layer_data,
				    port,
				    VXGE_HAL_XPAK_ALARM_EXCESS_LASER_OUTPUT);
			}
			break;
		default:
			vxge_hal_info_log_stats("%s",
			    "Incorrect XPAK Alarm type");
		}
	}

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);
}

/*
 * vxge_hal_mrpcim_xpak_stats_poll -  Poll and update the Xpak error count.
 * @devh: HAL device handle
 * @port: Port number
 *
 * It is used to update the xpak stats value
 */
vxge_hal_status_e
vxge_hal_mrpcim_xpak_stats_poll(
    vxge_hal_device_h devh, u32 port)
{
	u16 val;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("hldev = 0x"VXGE_OS_STXFMT", port = %d",
	    (ptr_t) hldev, port);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

		vxge_hal_trace_log_stats("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	/* Loading the DOM register to MDIO register */

	val = 0;

	status = __hal_mrpcim_mdio_access(devh, port,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_WRITE,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_CMD_STAT,
	    &val);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	status = __hal_mrpcim_mdio_access(devh, port,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_CMD_STAT,
	    &val);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	/*
	 * Reading the Alarm flags
	 */
	status = __hal_mrpcim_mdio_access(devh, port,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG,
	    &val);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	if (val &
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG_TEMP_HIGH) {
		hldev->mrpcim->xpak_stats[port].alarm_transceiver_temp_high++;
		hldev->mrpcim->xpak_stats[port].excess_temp++;
		__hal_mrpcim_xpak_counter_check(hldev, port,
		    VXGE_HAL_XPAK_ALARM_EXCESS_TEMP,
		    hldev->mrpcim->xpak_stats[port].excess_temp);
	} else {
		hldev->mrpcim->xpak_stats[port].excess_temp = 0;
	}

	if (val &
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG_TEMP_LOW) {
		hldev->mrpcim->xpak_stats[port].alarm_transceiver_temp_low++;
	}

	if (val &
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG_CUR_HIGH) {
		hldev->mrpcim->xpak_stats[port].alarm_laser_bias_current_high++;
		hldev->mrpcim->xpak_stats[port].excess_bias_current++;
		__hal_mrpcim_xpak_counter_check(hldev, port,
		    VXGE_HAL_XPAK_ALARM_EXCESS_BIAS_CURRENT,
		    hldev->mrpcim->xpak_stats[port].excess_bias_current);
	} else {
		hldev->mrpcim->xpak_stats[port].excess_bias_current = 0;
	}

	if (val &
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG_CUR_LOW) {
		hldev->mrpcim->xpak_stats[port].alarm_laser_bias_current_low++;
	}

	if (val &
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG_PWR_HIGH) {
		hldev->mrpcim->xpak_stats[port].alarm_laser_output_power_high++;
		hldev->mrpcim->xpak_stats[port].excess_laser_output++;
		__hal_mrpcim_xpak_counter_check(hldev, port,
		    VXGE_HAL_XPAK_ALARM_EXCESS_LASER_OUTPUT,
		    hldev->mrpcim->xpak_stats[port].excess_laser_output);
	} else {
		hldev->mrpcim->xpak_stats[port].excess_laser_output = 0;
	}

	if (val &
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_ALARM_FLAG_PWR_LOW) {
		hldev->mrpcim->xpak_stats[port].alarm_laser_output_power_low++;
	}

	/*
	 * Reading the warning flags
	 */
	status = __hal_mrpcim_mdio_access(devh, port,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD,
	    VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG,
	    &val);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	if (val & VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG_TEMP_HIGH)
		hldev->mrpcim->xpak_stats[port].warn_transceiver_temp_high++;
	if (val & VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG_TEMP_LOW)
		hldev->mrpcim->xpak_stats[port].warn_transceiver_temp_low++;
	if (val & VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG_CUR_HIGH)
		hldev->mrpcim->xpak_stats[port].warn_laser_bias_current_high++;
	if (val & VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG_CUR_LOW)
		hldev->mrpcim->xpak_stats[port].warn_laser_bias_current_low++;
	if (val & VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG_PWR_HIGH)
		hldev->mrpcim->xpak_stats[port].warn_laser_output_power_high++;
	if (val & VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_DOM_TX_WARN_FLAG_PWR_LOW)
		hldev->mrpcim->xpak_stats[port].warn_laser_output_power_low++;

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * vxge_hal_mrpcim_stats_enable - Enable mrpcim statistics.
 * @devh: HAL Device.
 *
 * Enable the DMA mrpcim statistics for the device. The function is to be called
 * to re-enable the adapter to update stats into the host memory
 *
 * See also: vxge_hal_mrpcim_stats_disable()
 */
vxge_hal_status_e
vxge_hal_mrpcim_stats_enable(vxge_hal_device_h devh)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

		vxge_hal_trace_log_stats("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	vxge_os_memcpy(&hldev->mrpcim->mrpcim_stats_sav,
	    hldev->mrpcim->mrpcim_stats,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	if (hldev->header.config.stats_read_method ==
	    VXGE_HAL_STATS_READ_METHOD_DMA) {

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->mrpcim_general_cfg2);

		val64 |= VXGE_HAL_MRPCIM_GENERAL_CFG2_MRPCIM_STATS_ENABLE;

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->mrpcim_general_cfg2);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->common_reg->stats_cfg0);

		val64 |= VXGE_HAL_STATS_CFG0_STATS_ENABLE(
		    (1 << (16 - hldev->first_vp_id)));

		vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
		    hldev->header.regh0,
		    (u32) bVAL32(val64, 0),
		    &hldev->common_reg->stats_cfg0);
	} else {
		status = __hal_mrpcim_stats_get(
		    hldev,
		    hldev->mrpcim->mrpcim_stats);
	}

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * vxge_hal_mrpcim_stats_disable - Disable mrpcim statistics.
 * @devh: HAL Device.
 *
 * Enable the DMA mrpcim statistics for the device. The function is to be called
 * to disable the adapter to update stats into the host memory. This function
 * is not needed to be called, normally.
 *
 * See also: vxge_hal_mrpcim_stats_enable()
 */
vxge_hal_status_e
vxge_hal_mrpcim_stats_disable(vxge_hal_device_h devh)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

		vxge_hal_trace_log_stats("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mrpcim_general_cfg2);

	val64 &= ~VXGE_HAL_MRPCIM_GENERAL_CFG2_MRPCIM_STATS_ENABLE;

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->mrpcim_general_cfg2);

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * vxge_hal_mrpcim_stats_get - Get the device mrpcim statistics.
 * @devh: HAL Device.
 * @stats: mrpcim stats
 *
 * Returns the device mrpcim stats for the device.
 *
 * See also: vxge_hal_device_stats_get()
 */
vxge_hal_status_e
vxge_hal_mrpcim_stats_get(
    vxge_hal_device_h devh,
    vxge_hal_mrpcim_stats_hw_info_t *stats)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert((hldev != NULL) && (stats != NULL));

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats(
	    "devh = 0x"VXGE_OS_STXFMT", stats = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, (ptr_t) stats);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

		vxge_hal_trace_log_stats("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	if (hldev->header.config.stats_read_method ==
	    VXGE_HAL_STATS_READ_METHOD_DMA) {

		status = vxge_hal_device_register_poll(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->common_reg->stats_cfg0,
		    0,
		    VXGE_HAL_STATS_CFG0_STATS_ENABLE(
		    (1 << (16 - hldev->first_vp_id))),
		    hldev->header.config.device_poll_millis);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->mrpcim_general_cfg2);

		val64 &= ~VXGE_HAL_MRPCIM_GENERAL_CFG2_MRPCIM_STATS_ENABLE;

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->mrpcim_general_cfg2);
	}

	if (status == VXGE_HAL_OK) {
		vxge_os_memcpy(stats,
		    hldev->mrpcim->mrpcim_stats,
		    sizeof(vxge_hal_mrpcim_stats_hw_info_t));
	}

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * vxge_hal_mrpcim_stats_access - Access the statistics from the given location
 *			  and offset and perform an operation
 * @devh: HAL Device handle.
 * @operation: Operation to be performed
 * @location: Location (one of vpath id, aggregate or port)
 * @offset: Offset with in the location
 * @stat: Pointer to a buffer to return the value
 *
 * Get the statistics from the given location and offset.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_stats_access(
    vxge_hal_device_h devh,
    u32 operation,
    u32 location,
    u32 offset,
    u64 *stat)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert((devh != NULL) && (stat != NULL));

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT", operation = %d, "
	    "location = %d, offset = %d, stat = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, operation, location, offset, (ptr_t) stat);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	val64 = VXGE_HAL_XMAC_STATS_SYS_CMD_OP(operation) |
	    VXGE_HAL_XMAC_STATS_SYS_CMD_STROBE |
	    VXGE_HAL_XMAC_STATS_SYS_CMD_LOC_SEL(location) |
	    VXGE_HAL_XMAC_STATS_SYS_CMD_OFFSET_SEL(offset);


	vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
	    hldev->header.regh0,
	    (u32) bVAL32(val64, 32),
	    &hldev->mrpcim_reg->xmac_stats_sys_cmd);

	vxge_os_wmb();

	vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
	    hldev->header.regh0,
	    (u32) bVAL32(val64, 0),
	    &hldev->mrpcim_reg->xmac_stats_sys_cmd);

	vxge_os_wmb();

	status = vxge_hal_device_register_poll(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->xmac_stats_sys_cmd,
	    0,
	    VXGE_HAL_XMAC_STATS_SYS_CMD_STROBE,
	    hldev->header.config.device_poll_millis);

	if ((status == VXGE_HAL_OK) && (operation == VXGE_HAL_STATS_OP_READ)) {

		*stat = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->xmac_stats_sys_data);

	} else {
		*stat = 0;
	}

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_xmac_aggr_stats_get - Get the Statistics on aggregate port
 * @devh: HAL device handle.
 * @port: Number of the port (0 or 1)
 * @aggr_stats: Buffer to return Statistics on aggregate port.
 *
 * Get the Statistics on aggregate port
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_xmac_aggr_stats_get(vxge_hal_device_h devh,
    u32 port,
    vxge_hal_xmac_aggr_stats_t *aggr_stats)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert((devh != NULL) && (aggr_stats != NULL));

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT", port = %d, "
	    "aggr_stats = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, port, (ptr_t) aggr_stats);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_TX_FRMS_OFFSET(port));

	aggr_stats->tx_frms =
	    VXGE_HAL_STATS_GET_AGGRn_TX_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_TX_DATA_OCTETS_OFFSET(port));

	aggr_stats->tx_data_octets =
	    VXGE_HAL_STATS_GET_AGGRn_TX_DATA_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_TX_MCAST_FRMS_OFFSET(port));

	aggr_stats->tx_mcast_frms =
	    VXGE_HAL_STATS_GET_AGGRn_TX_MCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_TX_BCAST_FRMS_OFFSET(port));

	aggr_stats->tx_bcast_frms =
	    VXGE_HAL_STATS_GET_AGGRn_TX_BCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_TX_DISCARDED_FRMS_OFFSET(port));

	aggr_stats->tx_discarded_frms =
	    VXGE_HAL_STATS_GET_AGGRn_TX_DISCARDED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_TX_ERRORED_FRMS_OFFSET(port));

	aggr_stats->tx_errored_frms =
	    VXGE_HAL_STATS_GET_AGGRn_TX_ERRORED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_FRMS_OFFSET(port));

	aggr_stats->rx_frms =
	    VXGE_HAL_STATS_GET_AGGRn_RX_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_DATA_OCTETS_OFFSET(port));

	aggr_stats->rx_data_octets =
	    VXGE_HAL_STATS_GET_AGGRn_RX_DATA_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_MCAST_FRMS_OFFSET(port));

	aggr_stats->rx_mcast_frms =
	    VXGE_HAL_STATS_GET_AGGRn_RX_MCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_BCAST_FRMS_OFFSET(port));

	aggr_stats->rx_bcast_frms =
	    VXGE_HAL_STATS_GET_AGGRn_RX_BCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_DISCARDED_FRMS_OFFSET(port));

	aggr_stats->rx_discarded_frms =
	    VXGE_HAL_STATS_GET_AGGRn_RX_DISCARDED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_ERRORED_FRMS_OFFSET(port));

	aggr_stats->rx_errored_frms =
	    VXGE_HAL_STATS_GET_AGGRn_RX_ERRORED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_AGGRn_RX_U_SLOW_PROTO_FRMS_OFFSET(port));

	aggr_stats->rx_unknown_slow_proto_frms =
	    VXGE_HAL_STATS_GET_AGGRn_RX_U_SLOW_PROTO_FRMS(val64);

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (VXGE_HAL_OK);
}


/*
 * vxge_hal_mrpcim_xmac_port_stats_get - Get the Statistics on a port
 * @devh: HAL device handle.
 * @port: Number of the port (wire 0, wire 1 or LAG)
 * @port_stats: Buffer to return Statistics on a port.
 *
 * Get the Statistics on port
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_xmac_port_stats_get(vxge_hal_device_h devh,
    u32 port,
    vxge_hal_xmac_port_stats_t *port_stats)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert((devh != NULL) && (port_stats != NULL));

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT", port = %d, "
	    "port_stats = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, port, (ptr_t) port_stats);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_TTL_FRMS_OFFSET(port));

	port_stats->tx_ttl_frms =
	    VXGE_HAL_STATS_GET_PORTn_TX_TTL_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_TTL_FRMS_OFFSET(port));

	port_stats->tx_ttl_octets =
	    VXGE_HAL_STATS_GET_PORTn_TX_TTL_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_DATA_OCTETS_OFFSET(port));

	port_stats->tx_data_octets =
	    VXGE_HAL_STATS_GET_PORTn_TX_DATA_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_MCAST_FRMS_OFFSET(port));

	port_stats->tx_mcast_frms =
	    VXGE_HAL_STATS_GET_PORTn_TX_MCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_BCAST_FRMS_OFFSET(port));

	port_stats->tx_bcast_frms =
	    VXGE_HAL_STATS_GET_PORTn_TX_BCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_UCAST_FRMS_OFFSET(port));

	port_stats->tx_ucast_frms =
	    VXGE_HAL_STATS_GET_PORTn_TX_UCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_TAGGED_FRMS_OFFSET(port));

	port_stats->tx_tagged_frms =
	    VXGE_HAL_STATS_GET_PORTn_TX_TAGGED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_VLD_IP_OFFSET(port));

	port_stats->tx_vld_ip =
	    VXGE_HAL_STATS_GET_PORTn_TX_VLD_IP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_VLD_IP_OCTETS_OFFSET(port));

	port_stats->tx_vld_ip_octets =
	    VXGE_HAL_STATS_GET_PORTn_TX_VLD_IP_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_ICMP_OFFSET(port));

	port_stats->tx_icmp =
	    VXGE_HAL_STATS_GET_PORTn_TX_ICMP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_TCP_OFFSET(port));

	port_stats->tx_tcp =
	    VXGE_HAL_STATS_GET_PORTn_TX_TCP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_RST_TCP_OFFSET(port));

	port_stats->tx_rst_tcp =
	    VXGE_HAL_STATS_GET_PORTn_TX_RST_TCP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_UDP_OFFSET(port));

	port_stats->tx_udp =
	    VXGE_HAL_STATS_GET_PORTn_TX_UDP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_UNKNOWN_PROTOCOL_OFFSET(port));

	port_stats->tx_unknown_protocol =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_UNKNOWN_PROTOCOL(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_PARSE_ERROR_OFFSET(port));

	port_stats->tx_parse_error =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_PARSE_ERROR(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_PAUSE_CTRL_FRMS_OFFSET(port));

	port_stats->tx_pause_ctrl_frms =
	    VXGE_HAL_STATS_GET_PORTn_TX_PAUSE_CTRL_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_LACPDU_FRMS_OFFSET(port));

	port_stats->tx_lacpdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_LACPDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_MRKR_PDU_FRMS_OFFSET(port));

	port_stats->tx_marker_pdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_MRKR_PDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_MRKR_RESP_PDU_FRMS_OFFSET(port));

	port_stats->tx_marker_resp_pdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_MRKR_RESP_PDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_DROP_IP_OFFSET(port));

	port_stats->tx_drop_ip =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_DROP_IP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_XGMII_CHAR1_MATCH_OFFSET(port));

	port_stats->tx_xgmii_char1_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_XGMII_CHAR1_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_XGMII_CHAR2_MATCH_OFFSET(port));

	port_stats->tx_xgmii_char2_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_XGMII_CHAR2_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_XGMII_COL1_MATCH_OFFSET(port));

	port_stats->tx_xgmii_column1_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_XGMII_COL1_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_XGMII_COL2_MATCH_OFFSET(port));

	port_stats->tx_xgmii_column2_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_TX_XGMII_COL2_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_DROP_FRMS_OFFSET(port));

	port_stats->tx_drop_frms =
	    (u16) VXGE_HAL_STATS_GET_PORTn_TX_DROP_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_TX_ANY_ERR_FRMS_OFFSET(port));

	port_stats->tx_any_err_frms =
	    (u16) VXGE_HAL_STATS_GET_PORTn_TX_ANY_ERR_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_FRMS_OFFSET(port));

	port_stats->rx_ttl_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_VLD_FRMS_OFFSET(port));

	port_stats->rx_vld_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_VLD_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_OFFLOAD_FRMS_OFFSET(port));

	port_stats->rx_offload_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_OFFLOAD_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_OCTETS_OFFSET(port));

	port_stats->rx_ttl_octets =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_DATA_OCTETS_OFFSET(port));

	port_stats->rx_data_octets =
	    VXGE_HAL_STATS_GET_PORTn_RX_DATA_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_OFFLOAD_OCTETS_OFFSET(port));

	port_stats->rx_offload_octets =
	    VXGE_HAL_STATS_GET_PORTn_RX_OFFLOAD_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_VLD_MCAST_FRMS_OFFSET(port));

	port_stats->rx_vld_mcast_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_VLD_MCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_VLD_BCAST_FRMS_OFFSET(port));

	port_stats->rx_vld_bcast_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_VLD_BCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ACC_UCAST_FRMS_OFFSET(port));

	port_stats->rx_accepted_ucast_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_ACC_UCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ACC_NUCAST_FRMS_OFFSET(port));

	port_stats->rx_accepted_nucast_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_ACC_NUCAST_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TAGGED_FRMS_OFFSET(port));

	port_stats->rx_tagged_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TAGGED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_LONG_FRMS_OFFSET(port));

	port_stats->rx_long_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_LONG_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_USIZED_FRMS_OFFSET(port));

	port_stats->rx_usized_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_USIZED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_OSIZED_FRMS_OFFSET(port));

	port_stats->rx_osized_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_OSIZED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_FRAG_FRMS_OFFSET(port));

	port_stats->rx_frag_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_FRAG_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_JABBER_FRMS_OFFSET(port));

	port_stats->rx_jabber_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_JABBER_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_64_FRMS_OFFSET(port));

	port_stats->rx_ttl_64_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_64_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_65_127_FRMS_OFFSET(port));

	port_stats->rx_ttl_65_127_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_65_127_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_128_255_FRMS_OFFSET(port));

	port_stats->rx_ttl_128_255_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_128_255_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_256_511_FRMS_OFFSET(port));

	port_stats->rx_ttl_256_511_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_256_511_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_512_1023_FRMS_OFFSET(port));

	port_stats->rx_ttl_512_1023_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_512_1023_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_1024_1518_FRMS_OFFSET(port));

	port_stats->rx_ttl_1024_1518_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_1024_1518_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_1519_4095_FRMS_OFFSET(port));

	port_stats->rx_ttl_1519_4095_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_1519_4095_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_4096_81915_FRMS_OFFSET(port));

	port_stats->rx_ttl_4096_8191_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_4096_8191_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_8192_MAX_FRMS_OFFSET(port));

	port_stats->rx_ttl_8192_max_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_8192_MAX_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TTL_GT_MAX_FRMS_OFFSET(port));

	port_stats->rx_ttl_gt_max_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_TTL_GT_MAX_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_IP_OFFSET(port));

	port_stats->rx_ip = VXGE_HAL_STATS_GET_PORTn_RX_IP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ACC_IP_OFFSET(port));

	port_stats->rx_accepted_ip =
	    VXGE_HAL_STATS_GET_PORTn_RX_ACC_IP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_IP_OCTETS_OFFSET(port));

	port_stats->rx_ip_octets =
	    VXGE_HAL_STATS_GET_PORTn_RX_IP_OCTETS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ERR_IP_OFFSET(port));

	port_stats->rx_err_ip =
	    VXGE_HAL_STATS_GET_PORTn_RX_ERR_IP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ICMP_OFFSET(port));

	port_stats->rx_icmp = VXGE_HAL_STATS_GET_PORTn_RX_ICMP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TCP_OFFSET(port));

	port_stats->rx_tcp = VXGE_HAL_STATS_GET_PORTn_RX_TCP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_UDP_OFFSET(port));

	port_stats->rx_udp = VXGE_HAL_STATS_GET_PORTn_RX_UDP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ERR_TCP_OFFSET(port));

	port_stats->rx_err_tcp = VXGE_HAL_STATS_GET_PORTn_RX_ERR_TCP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_PAUSE_CNT_OFFSET(port));

	port_stats->rx_pause_count =
	    VXGE_HAL_STATS_GET_PORTn_RX_PAUSE_CNT(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_PAUSE_CTRL_FRMS_OFFSET(port));

	port_stats->rx_pause_ctrl_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_PAUSE_CTRL_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_UNSUP_CTRL_FRMS_OFFSET(port));

	port_stats->rx_unsup_ctrl_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_UNSUP_CTRL_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_FCS_ERR_FRMS_OFFSET(port));

	port_stats->rx_fcs_err_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_FCS_ERR_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_IN_RNG_LEN_ERR_FRMS_OFFSET(port));

	port_stats->rx_in_rng_len_err_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_IN_RNG_LEN_ERR_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_OUT_RNG_LEN_ERR_FRMS_OFFSET(port));

	port_stats->rx_out_rng_len_err_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_OUT_RNG_LEN_ERR_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_DROP_FRMS_OFFSET(port));

	port_stats->rx_drop_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_DROP_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_DISCARDED_FRMS_OFFSET(port));

	port_stats->rx_discarded_frms =
	    VXGE_HAL_STATS_GET_PORTn_RX_DISCARDED_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_DROP_IP_OFFSET(port));

	port_stats->rx_drop_ip =
	    VXGE_HAL_STATS_GET_PORTn_RX_DROP_IP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_DRP_UDP_OFFSET(port));

	port_stats->rx_drop_udp =
	    VXGE_HAL_STATS_GET_PORTn_RX_DRP_UDP(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_LACPDU_FRMS_OFFSET(port));

	port_stats->rx_lacpdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_LACPDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_MRKR_PDU_FRMS_OFFSET(port));

	port_stats->rx_marker_pdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_MRKR_PDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_MRKR_RESP_PDU_FRMS_OFFSET(port));

	port_stats->rx_marker_resp_pdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_MRKR_RESP_PDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_UNKNOWN_PDU_FRMS_OFFSET(port));

	port_stats->rx_unknown_pdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_UNKNOWN_PDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_ILLEGAL_PDU_FRMS_OFFSET(port));

	port_stats->rx_illegal_pdu_frms =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_ILLEGAL_PDU_FRMS(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_FCS_DISCARD_OFFSET(port));

	port_stats->rx_fcs_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_FCS_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_LEN_DISCARD_OFFSET(port));

	port_stats->rx_len_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_LEN_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_SWITCH_DISCARD_OFFSET(port));

	port_stats->rx_switch_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_SWITCH_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_L2_MGMT_DISCARD_OFFSET(port));

	port_stats->rx_l2_mgmt_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_L2_MGMT_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_RPA_DISCARD_OFFSET(port));

	port_stats->rx_rpa_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_RPA_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_TRASH_DISCARD_OFFSET(port));

	port_stats->rx_trash_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_TRASH_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_RTS_DISCARD_OFFSET(port));

	port_stats->rx_rts_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_RTS_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_RED_DISCARD_OFFSET(port));

	port_stats->rx_red_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_RED_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_BUFF_FULL_DISCARD_OFFSET(port));

	port_stats->rx_buff_full_discard =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_BUFF_FULL_DISCARD(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_DATA_ERR_CNT_OFFSET(port));

	port_stats->rx_xgmii_data_err_cnt =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_DATA_ERR_CNT(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_CTRL_ERR_CNT_OFFSET(port));

	port_stats->rx_xgmii_ctrl_err_cnt =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_CTRL_ERR_CNT(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_ERR_SYM_OFFSET(port));

	port_stats->rx_xgmii_err_sym =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_ERR_SYM(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_CHAR1_MATCH_OFFSET(port));

	port_stats->rx_xgmii_char1_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_CHAR1_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_CHAR2_MATCH_OFFSET(port));

	port_stats->rx_xgmii_char2_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_CHAR2_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_COL1_MATCH_OFFSET(port));

	port_stats->rx_xgmii_column1_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_COL1_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_XGMII_COL2_MATCH_OFFSET(port));

	port_stats->rx_xgmii_column2_match =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_XGMII_COL2_MATCH(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_LOCAL_FAULT_OFFSET(port));

	port_stats->rx_local_fault =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_LOCAL_FAULT(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_REMOTE_FAULT_OFFSET(port));

	port_stats->rx_remote_fault =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_REMOTE_FAULT(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_PORT,
	    VXGE_HAL_STATS_PORTn_RX_JETTISON_OFFSET(port));

	port_stats->rx_jettison =
	    (u32) VXGE_HAL_STATS_GET_PORTn_RX_JETTISON(val64);


	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (VXGE_HAL_OK);
}


/*
 * vxge_hal_mrpcim_xmac_stats_get - Get the XMAC Statistics
 * @devh: HAL device handle.
 * @xmac_stats: Buffer to return XMAC Statistics.
 *
 * Get the XMAC Statistics
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_xmac_stats_get(vxge_hal_device_h devh,
    vxge_hal_mrpcim_xmac_stats_t *xmac_stats)
{
	u32 i;
	__hal_device_t *hldev = (__hal_device_t *) devh;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert((devh != NULL) && (xmac_stats != NULL));

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats(
	    "hldev = 0x"VXGE_OS_STXFMT", mrpcim_stats = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, (ptr_t) xmac_stats);


	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	status = vxge_hal_mrpcim_xmac_aggr_stats_get(devh,
	    0,
	    &xmac_stats->aggr_stats[0]);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	status = vxge_hal_mrpcim_xmac_aggr_stats_get(devh,
	    1,
	    &xmac_stats->aggr_stats[1]);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	for (i = 0; i < VXGE_HAL_MAC_MAX_PORTS; i++) {

		status = vxge_hal_mrpcim_xmac_port_stats_get(devh,
		    i,
		    &xmac_stats->port_stats[i]);

		if (status != VXGE_HAL_OK) {
			vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
			    __FILE__, __func__, __LINE__, status);
			return (status);
		}

	}

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * _hal_mrpcim_stats_get - Get the mrpcim statistics using PIO
 * @hldev: hal device.
 * @mrpcim_stats: MRPCIM stats
 *
 * Returns the mrpcim stats.
 *
 * See also: vxge_hal_mrpcim_stats_enable(), vxge_hal_mrpcim_stats_disable()
 */
vxge_hal_status_e
__hal_mrpcim_stats_get(
    __hal_device_t *hldev,
    vxge_hal_mrpcim_stats_hw_info_t *mrpcim_stats)
{
	u32 i;
	u64 val64;
	vxge_hal_device_h devh = (vxge_hal_device_h) hldev;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert((hldev != NULL) && (mrpcim_stats != NULL));

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats(
	    "hldev = 0x"VXGE_OS_STXFMT", mrpcim_stats = 0x"VXGE_OS_STXFMT,
	    (ptr_t) hldev, (ptr_t) mrpcim_stats);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mrpcim_debug_stats0);

	mrpcim_stats->pic_ini_rd_drop =
	    (u32) VXGE_HAL_MRPCIM_DEBUG_STATS0_GET_INI_RD_DROP(val64);

	mrpcim_stats->pic_ini_wr_drop =
	    (u32) VXGE_HAL_MRPCIM_DEBUG_STATS0_GET_INI_WR_DROP(val64);

	for (i = 0; i < VXGE_HAL_MAX_VIRTUAL_PATHS; i++) {
		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->mrpcim_debug_stats1_vplane[i]);

		mrpcim_stats->pic_wrcrdtarb_ph_crdt_depleted_vplane[i].
		    pic_wrcrdtarb_ph_crdt_depleted = (u32)
		    VXGE_HAL_MRPCIM_DEBUG_STATS1_GET_VPLANE_WRCRDTARB_PH_CRDT_DEPLETED(
		    val64);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->mrpcim_debug_stats2_vplane[i]);

		mrpcim_stats->pic_wrcrdtarb_pd_crdt_depleted_vplane[i].
		    pic_wrcrdtarb_pd_crdt_depleted = (u32)
		    VXGE_HAL_MRPCIM_DEBUG_STATS2_GET_VPLANE_WRCRDTARB_PD_CRDT_DEPLETED(
		    val64);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->mrpcim_debug_stats3_vplane[i]);

		mrpcim_stats->pic_rdcrdtarb_nph_crdt_depleted_vplane[i].
		    pic_rdcrdtarb_nph_crdt_depleted = (u32)
		    VXGE_HAL_MRPCIM_DEBUG_STATS3_GET_VPLANE_RDCRDTARB_NPH_CRDT_DEPLETED(
		    val64);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mrpcim_debug_stats4);

	mrpcim_stats->pic_ini_rd_vpin_drop =
	    (u32) VXGE_HAL_MRPCIM_DEBUG_STATS4_GET_INI_RD_VPIN_DROP(val64);

	mrpcim_stats->pic_ini_wr_vpin_drop =
	    (u32) VXGE_HAL_MRPCIM_DEBUG_STATS4_GET_INI_WR_VPIN_DROP(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->genstats_count01);

	mrpcim_stats->pic_genstats_count0 =
	    (u32) VXGE_HAL_GENSTATS_COUNT01_GET_GENSTATS_COUNT0(val64);

	mrpcim_stats->pic_genstats_count1 =
	    (u32) VXGE_HAL_GENSTATS_COUNT01_GET_GENSTATS_COUNT1(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->genstats_count23);

	mrpcim_stats->pic_genstats_count2 =
	    (u32) VXGE_HAL_GENSTATS_COUNT23_GET_GENSTATS_COUNT2(val64);

	mrpcim_stats->pic_genstats_count3 =
	    (u32) VXGE_HAL_GENSTATS_COUNT23_GET_GENSTATS_COUNT3(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->genstats_count4);

	mrpcim_stats->pic_genstats_count4 =
	    (u32) VXGE_HAL_GENSTATS_COUNT4_GET_GENSTATS_COUNT4(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->genstats_count5);

	mrpcim_stats->pic_genstats_count5 =
	    (u32) VXGE_HAL_GENSTATS_COUNT5_GET_GENSTATS_COUNT5(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->debug_stats0);

	mrpcim_stats->pci_rstdrop_cpl =
	    (u32) VXGE_HAL_DEBUG_STATS0_GET_RSTDROP_CPL(val64);

	mrpcim_stats->pci_rstdrop_msg =
	    (u32) VXGE_HAL_DEBUG_STATS0_GET_RSTDROP_MSG(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->debug_stats1);

	mrpcim_stats->pci_rstdrop_client0 =
	    (u32) VXGE_HAL_DEBUG_STATS1_GET_RSTDROP_CLIENT0(val64);

	mrpcim_stats->pci_rstdrop_client1 =
	    (u32) VXGE_HAL_DEBUG_STATS1_GET_RSTDROP_CLIENT1(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->debug_stats2);

	mrpcim_stats->pci_rstdrop_client2 =
	    (u32) VXGE_HAL_DEBUG_STATS2_GET_RSTDROP_CLIENT2(val64);

	for (i = 0; i < VXGE_HAL_MAX_VIRTUAL_PATHS; i++) {
		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->debug_stats3_vplane);

		mrpcim_stats->pci_depl_h_vplane[i].pci_depl_cplh =
		    (u16) VXGE_HAL_DEBUG_STATS3_GET_VPLANE_DEPL_CPLH(val64);

		mrpcim_stats->pci_depl_h_vplane[i].pci_depl_nph =
		    (u16) VXGE_HAL_DEBUG_STATS3_GET_VPLANE_DEPL_NPH(val64);

		mrpcim_stats->pci_depl_h_vplane[i].pci_depl_ph =
		    (u16) VXGE_HAL_DEBUG_STATS3_GET_VPLANE_DEPL_PH(val64);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->debug_stats4_vplane);

		mrpcim_stats->pci_depl_d_vplane[i].pci_depl_cpld =
		    (u16) VXGE_HAL_DEBUG_STATS4_GET_VPLANE_DEPL_CPLD(val64);

		mrpcim_stats->pci_depl_d_vplane[i].pci_depl_npd =
		    (u16) VXGE_HAL_DEBUG_STATS4_GET_VPLANE_DEPL_NPD(val64);

		mrpcim_stats->pci_depl_d_vplane[i].pci_depl_pd =
		    (u16) VXGE_HAL_DEBUG_STATS4_GET_VPLANE_DEPL_PD(val64);
	}

	status = vxge_hal_mrpcim_xmac_aggr_stats_get(hldev,
	    0,
	    &mrpcim_stats->xgmac_aggr[0]);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	status = vxge_hal_mrpcim_xmac_aggr_stats_get(hldev,
	    1,
	    &mrpcim_stats->xgmac_aggr[1]);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	for (i = 0; i < VXGE_HAL_MAC_MAX_PORTS; i++) {

		status = vxge_hal_mrpcim_xmac_port_stats_get(hldev,
		    i,
		    &mrpcim_stats->xgmac_port[i]);

		if (status != VXGE_HAL_OK) {
			vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
			    __FILE__, __func__, __LINE__, status);
			return (status);
		}

	}

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_GLOBAL_PROG_EVENT_GNUM0_OFFSET);

	mrpcim_stats->xgmac_global_prog_event_gnum0 =
	    VXGE_HAL_STATS_GET_GLOBAL_PROG_EVENT_GNUM0(val64);

	VXGE_HAL_MRPCIM_STATS_PIO_READ(VXGE_HAL_STATS_LOC_AGGR,
	    VXGE_HAL_STATS_GLOBAL_PROG_EVENT_GNUM1_OFFSET);

	mrpcim_stats->xgmac_global_prog_event_gnum1 =
	    VXGE_HAL_STATS_GET_GLOBAL_PROG_EVENT_GNUM1(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->orp_lro_events);

	mrpcim_stats->xgmac_orp_lro_events =
	    VXGE_HAL_ORP_LRO_EVENTS_GET_ORP_LRO_EVENTS(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->orp_bs_events);

	mrpcim_stats->xgmac_orp_bs_events =
	    VXGE_HAL_ORP_BS_EVENTS_GET_ORP_BS_EVENTS(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->orp_iwarp_events);

	mrpcim_stats->xgmac_orp_iwarp_events =
	    VXGE_HAL_ORP_IWARP_EVENTS_GET_ORP_IWARP_EVENTS(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->dbg_stats_tpa_tx_path);

	mrpcim_stats->xgmac_tx_permitted_frms =
	    (u32) VXGE_HAL_DBG_STATS_TPA_TX_PATH_GET_TX_PERMITTED_FRMS(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->dbg_stat_tx_any_frms);

	mrpcim_stats->xgmac_port0_tx_any_frms =
	    (u8) VXGE_HAL_DBG_STAT_TX_ANY_FRMS_GET_PORT0_TX_ANY_FRMS(val64);

	mrpcim_stats->xgmac_port1_tx_any_frms =
	    (u8) VXGE_HAL_DBG_STAT_TX_ANY_FRMS_GET_PORT1_TX_ANY_FRMS(val64);

	mrpcim_stats->xgmac_port2_tx_any_frms =
	    (u8) VXGE_HAL_DBG_STAT_TX_ANY_FRMS_GET_PORT2_TX_ANY_FRMS(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->dbg_stat_rx_any_frms);

	mrpcim_stats->xgmac_port0_rx_any_frms =
	    (u8) VXGE_HAL_DBG_STAT_RX_ANY_FRMS_GET_PORT0_RX_ANY_FRMS(val64);

	mrpcim_stats->xgmac_port1_rx_any_frms =
	    (u8) VXGE_HAL_DBG_STAT_RX_ANY_FRMS_GET_PORT1_RX_ANY_FRMS(val64);

	mrpcim_stats->xgmac_port2_rx_any_frms =
	    (u8) VXGE_HAL_DBG_STAT_RX_ANY_FRMS_GET_PORT2_RX_ANY_FRMS(val64);

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * vxge_hal_mrpcim_stats_clear - Clear the statistics of the device
 * @devh: HAL Device handle.
 *
 * Clear the statistics of the given Device.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_stats_clear(vxge_hal_device_h devh)
{
	u32 i;
	u64 stat;
	vxge_hal_status_e status;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	vxge_os_memcpy(&hldev->mrpcim->mrpcim_stats_sav,
	    hldev->mrpcim->mrpcim_stats,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	vxge_os_memzero(hldev->mrpcim->mrpcim_stats,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	vxge_os_memzero(&hldev->stats.sw_dev_err_stats,
	    sizeof(vxge_hal_device_stats_sw_err_t));

	hldev->stats.sw_dev_info_stats.soft_reset_cnt = 0;

	for (i = 0; i < VXGE_HAL_MAX_VIRTUAL_PATHS; i++) {

		if (!(hldev->vpaths_deployed & mBIT(i)))
			continue;

		(void) vxge_hal_vpath_stats_clear(
		    VXGE_HAL_VIRTUAL_PATH_HANDLE(&hldev->virtual_paths[i]));

	}

	status = vxge_hal_mrpcim_stats_access(
	    devh,
	    VXGE_HAL_STATS_OP_CLEAR_ALL_STATS,
	    0,
	    0,
	    &stat);

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * vxge_hal_mrpcim_udp_rth_enable - Enable UDP/RTH.
 * @devh: HAL device handle.
 *
 * enable udp rth
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_udp_rth_enable(
    vxge_hal_device_h devh)
{
	vxge_hal_status_e status = VXGE_HAL_OK;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_stats("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_stats("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {

		vxge_hal_trace_log_stats("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

	}

	status = __hal_vpath_udp_rth_set(hldev,
	    hldev->first_vp_id,
	    TRUE);

	vxge_hal_trace_log_stats("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * __hal_mrpcim_mac_configure - Initialize mac
 * @hldev: hal device.
 *
 * Initializes mac
 *
 */
vxge_hal_status_e
__hal_mrpcim_mac_configure(__hal_device_t *hldev)
{
	u64 val64;
	u32 i, port_id;
	vxge_hal_status_e status = VXGE_HAL_OK;
	vxge_hal_mac_config_t *mac_config =
	&hldev->header.config.mrpcim_config.mac_config;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("hldev = 0x"VXGE_OS_STXFMT,
	    (ptr_t) hldev);

	for (i = 0; i < VXGE_HAL_MAC_MAX_WIRE_PORTS; i++) {

		port_id = mac_config->wire_port_config[i].port_id;

		if (mac_config->wire_port_config[i].tmac_en ==
		    VXGE_HAL_WIRE_PORT_TMAC_DEFAULT) {
			val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
			    hldev->header.regh0,
			    &hldev->mrpcim_reg->txmac_cfg0_port[port_id]);

			if (val64 & VXGE_HAL_TXMAC_CFG0_PORT_TMAC_EN) {
				mac_config->wire_port_config[i].tmac_en =
				    VXGE_HAL_WIRE_PORT_TMAC_ENABLE;
			} else {
				mac_config->wire_port_config[i].tmac_en =
				    VXGE_HAL_WIRE_PORT_TMAC_DISABLE;
			}

		}

		if (mac_config->wire_port_config[i].rmac_en ==
		    VXGE_HAL_WIRE_PORT_RMAC_DEFAULT) {
			val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
			    hldev->header.regh0,
			    &hldev->mrpcim_reg->rxmac_cfg0_port[port_id]);

			if (val64 & VXGE_HAL_RXMAC_CFG0_PORT_RMAC_EN) {
				mac_config->wire_port_config[i].rmac_en =
				    VXGE_HAL_WIRE_PORT_RMAC_ENABLE;
			} else {
				mac_config->wire_port_config[i].rmac_en =
				    VXGE_HAL_WIRE_PORT_RMAC_DISABLE;
			}

		}

		if ((!(mac_config->wire_port_config[i].rmac_en)) &&
		    (!(mac_config->wire_port_config[i].tmac_en)))
			val64 = 0;
		else
			val64 = VXGE_HAL_XGMAC_MAIN_CFG_PORT_PORT_EN;

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->xgmac_main_cfg_port[port_id]);

		if (!val64)
			continue;

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_cfg0_port[port_id]);

		if (mac_config->wire_port_config[i].rmac_en)
			val64 |= VXGE_HAL_RXMAC_CFG0_PORT_RMAC_EN;
		else
			val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_RMAC_EN;

		if (mac_config->wire_port_config[i].rmac_strip_fcs !=
		    VXGE_HAL_WIRE_PORT_RMAC_STRIP_FCS_DEFAULT) {
			if (mac_config->wire_port_config[i].rmac_strip_fcs)
				val64 |= VXGE_HAL_RXMAC_CFG0_PORT_STRIP_FCS;
			else
				val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_STRIP_FCS;
		}

		if (mac_config->wire_port_config[i].rmac_discard_pfrm !=
		    VXGE_HAL_WIRE_PORT_RMAC_DISCARD_PFRM_DEFAULT) {
			if (mac_config->wire_port_config[i].rmac_discard_pfrm)
				val64 |= VXGE_HAL_RXMAC_CFG0_PORT_DISCARD_PFRM;
			else
				val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_DISCARD_PFRM;
		}

		if (mac_config->wire_port_config[i].mtu !=
		    VXGE_HAL_WIRE_PORT_DEF_INITIAL_MTU) {

			val64 &=
			    ~VXGE_HAL_RXMAC_CFG0_PORT_MAX_PYLD_LEN(0x3fff);

			val64 |= VXGE_HAL_RXMAC_CFG0_PORT_MAX_PYLD_LEN(
			    mac_config->wire_port_config[i].mtu);

		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_cfg0_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_cfg2_port[port_id]);

		if (mac_config->wire_port_config[i].rmac_prom_en !=
		    VXGE_HAL_WIRE_PORT_RMAC_PROM_EN_DEFAULT) {
			if (mac_config->wire_port_config[i].rmac_prom_en)
				val64 |= VXGE_HAL_RXMAC_CFG2_PORT_PROM_EN;
			else
				val64 &= ~VXGE_HAL_RXMAC_CFG2_PORT_PROM_EN;
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_cfg2_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_pause_cfg_port[port_id]);

		if (mac_config->wire_port_config[i].rmac_pause_gen_en !=
		    VXGE_HAL_WIRE_PORT_RMAC_PAUSE_GEN_EN_DEFAULT) {
			if (mac_config->wire_port_config[i].rmac_pause_gen_en)
				val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN;
			else
				val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN;

		}

		if (mac_config->wire_port_config[i].rmac_pause_rcv_en !=
		    VXGE_HAL_WIRE_PORT_RMAC_PAUSE_RCV_EN_DEFAULT) {
			if (mac_config->wire_port_config[i].rmac_pause_rcv_en)
				val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN;
			else
				val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN;

		}

		if (mac_config->wire_port_config[i].rmac_pause_time !=
		    VXGE_HAL_WIRE_PORT_DEF_RMAC_HIGH_PTIME) {
			val64 &=
			    ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_HIGH_PTIME(0xffff);

			val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_HIGH_PTIME(
			    mac_config->wire_port_config[i].rmac_pause_time);

		}

		if (mac_config->wire_port_config[i].rmac_pause_time !=
		    VXGE_HAL_WIRE_PORT_RMAC_PAUSE_LIMITER_DEFAULT) {
			if (mac_config->wire_port_config[i].limiter_en)
				val64 |=
				    VXGE_HAL_RXMAC_PAUSE_CFG_PORT_LIMITER_EN;
			else
				val64 &=
				    ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_LIMITER_EN;

		}

		if (mac_config->wire_port_config[i].max_limit !=
		    VXGE_HAL_WIRE_PORT_DEF_RMAC_MAX_LIMIT) {
			val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_MAX_LIMIT(0xff);

			val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_MAX_LIMIT(
			    mac_config->wire_port_config[i].max_limit);

		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_pause_cfg_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_link_util_port[port_id]);

		if (mac_config->wire_port_config[i].rmac_util_period !=
		    VXGE_HAL_WIRE_PORT_DEF_TMAC_UTIL_PERIOD) {
			val64 &=
			    ~VXGE_HAL_RXMAC_LINK_UTIL_PORT_RMAC_UTIL_CFG(0xf);

			val64 |= VXGE_HAL_RXMAC_LINK_UTIL_PORT_RMAC_UTIL_CFG(
			    mac_config->wire_port_config[i].rmac_util_period);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_link_util_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->xgmac_debounce_port[port_id]);

		if (mac_config->wire_port_config[i].link_stability_period !=
		    VXGE_HAL_WIRE_PORT_DEF_LINK_STABILITY_PERIOD) {
			val64 &=
			    ~(VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_LINK_UP(0xf) |
			    VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_LINK_DOWN(0xf));

			val64 |= VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_LINK_UP(
			    mac_config->wire_port_config[i].link_stability_period) |
			    VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_LINK_DOWN(
			    mac_config->wire_port_config[i].link_stability_period);
		}

		if (mac_config->wire_port_config[i].port_stability_period !=
		    VXGE_HAL_WIRE_PORT_DEF_PORT_STABILITY_PERIOD) {
			val64 &=
			    ~(VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_PORT_UP(0xf) |
			    VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_PORT_DOWN(0xf));

			val64 |= VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_PORT_UP(
			    mac_config->wire_port_config[i].port_stability_period) |
			    VXGE_HAL_XGMAC_DEBOUNCE_PORT_PERIOD_PORT_DOWN(
			    mac_config->wire_port_config[i].port_stability_period);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->xgmac_debounce_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->txmac_cfg0_port[port_id]);

		if (mac_config->wire_port_config[i].tmac_en)
			val64 |= VXGE_HAL_TXMAC_CFG0_PORT_TMAC_EN;
		else
			val64 &= ~VXGE_HAL_TXMAC_CFG0_PORT_TMAC_EN;

		if (mac_config->wire_port_config[i].tmac_pad !=
		    VXGE_HAL_WIRE_PORT_TMAC_PAD_DEFAULT) {
			if (mac_config->wire_port_config[i].tmac_pad)
				val64 |= VXGE_HAL_TXMAC_CFG0_PORT_APPEND_PAD;
			else
				val64 &= ~VXGE_HAL_TXMAC_CFG0_PORT_APPEND_PAD;
		}

		if (mac_config->wire_port_config[i].tmac_pad_byte !=
		    VXGE_HAL_WIRE_PORT_TMAC_PAD_DEFAULT) {
			val64 &= ~VXGE_HAL_TXMAC_CFG0_PORT_PAD_BYTE(0xff);

			val64 |= VXGE_HAL_TXMAC_CFG0_PORT_PAD_BYTE(
			    mac_config->wire_port_config[i].tmac_pad_byte);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->txmac_cfg0_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->txmac_link_util_port);

		if (mac_config->wire_port_config[i].tmac_util_period !=
		    VXGE_HAL_WIRE_PORT_DEF_TMAC_UTIL_PERIOD) {
			val64 &=
			    ~VXGE_HAL_TXMAC_LINK_UTIL_PORT_TMAC_UTIL_CFG(0xf);

			val64 |= VXGE_HAL_TXMAC_LINK_UTIL_PORT_TMAC_UTIL_CFG(
			    mac_config->wire_port_config[i].tmac_util_period);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->txmac_link_util_port[port_id]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->ratemgmt_cfg_port);

		if (mac_config->wire_port_config[i].autoneg_mode !=
		    VXGE_HAL_WIRE_PORT_AUTONEG_MODE_DEFAULT) {

			val64 &= ~VXGE_HAL_RATEMGMT_CFG_PORT_MODE(0x3);

			val64 |= VXGE_HAL_RATEMGMT_CFG_PORT_MODE(
			    mac_config->wire_port_config[i].autoneg_mode);
		}

		if (mac_config->wire_port_config[i].autoneg_rate !=
		    VXGE_HAL_WIRE_PORT_AUTONEG_RATE_DEFAULT) {

			if (mac_config->wire_port_config[i].autoneg_rate)
				val64 |= VXGE_HAL_RATEMGMT_CFG_PORT_RATE;
			else
				val64 &= ~VXGE_HAL_RATEMGMT_CFG_PORT_RATE;

		}

		if (mac_config->wire_port_config[i].fixed_use_fsm !=
		    VXGE_HAL_WIRE_PORT_FIXED_USE_FSM_DEFAULT) {

			if (mac_config->wire_port_config[i].fixed_use_fsm)
				val64 |=
				    VXGE_HAL_RATEMGMT_CFG_PORT_FIXED_USE_FSM;
			else
				val64 &=
				    ~VXGE_HAL_RATEMGMT_CFG_PORT_FIXED_USE_FSM;

		}

		if (mac_config->wire_port_config[i].antp_use_fsm !=
		    VXGE_HAL_WIRE_PORT_ANTP_USE_FSM_DEFAULT) {

			if (mac_config->wire_port_config[i].antp_use_fsm)
				val64 |=
				    VXGE_HAL_RATEMGMT_CFG_PORT_ANTP_USE_FSM;
			else
				val64 &=
				    ~VXGE_HAL_RATEMGMT_CFG_PORT_ANTP_USE_FSM;

		}

		if (mac_config->wire_port_config[i].anbe_use_fsm !=
		    VXGE_HAL_WIRE_PORT_ANBE_USE_FSM_DEFAULT) {

			if (mac_config->wire_port_config[i].anbe_use_fsm)
				val64 |=
				    VXGE_HAL_RATEMGMT_CFG_PORT_ANBE_USE_FSM;
			else
				val64 &=
				    ~VXGE_HAL_RATEMGMT_CFG_PORT_ANBE_USE_FSM;

		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->ratemgmt_cfg_port[port_id]);

	}

	if (mac_config->switch_port_config.tmac_en ==
	    VXGE_HAL_SWITCH_PORT_TMAC_DEFAULT) {
		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->txmac_cfg0_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (val64 & VXGE_HAL_TXMAC_CFG0_PORT_TMAC_EN) {
			mac_config->switch_port_config.tmac_en =
			    VXGE_HAL_SWITCH_PORT_TMAC_ENABLE;
		} else {
			mac_config->switch_port_config.tmac_en =
			    VXGE_HAL_SWITCH_PORT_TMAC_DISABLE;
		}

	}

	if (mac_config->switch_port_config.rmac_en ==
	    VXGE_HAL_SWITCH_PORT_RMAC_DEFAULT) {
		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_cfg0_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (val64 & VXGE_HAL_RXMAC_CFG0_PORT_RMAC_EN) {
			mac_config->switch_port_config.rmac_en =
			    VXGE_HAL_SWITCH_PORT_RMAC_ENABLE;
		} else {
			mac_config->switch_port_config.rmac_en =
			    VXGE_HAL_SWITCH_PORT_RMAC_DISABLE;
		}

	}

	if (mac_config->switch_port_config.rmac_en ||
	    mac_config->switch_port_config.tmac_en) {

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_cfg0_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (mac_config->switch_port_config.rmac_en)
			val64 |= VXGE_HAL_RXMAC_CFG0_PORT_RMAC_EN;
		else
			val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_RMAC_EN;

		if (mac_config->switch_port_config.rmac_strip_fcs !=
		    VXGE_HAL_SWITCH_PORT_RMAC_STRIP_FCS_DEFAULT) {
			if (mac_config->switch_port_config.rmac_strip_fcs)
				val64 |= VXGE_HAL_RXMAC_CFG0_PORT_STRIP_FCS;
			else
				val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_STRIP_FCS;
		}

		if (mac_config->switch_port_config.rmac_discard_pfrm !=
		    VXGE_HAL_SWITCH_PORT_RMAC_DISCARD_PFRM_DEFAULT) {
			if (mac_config->switch_port_config.rmac_discard_pfrm)
				val64 |= VXGE_HAL_RXMAC_CFG0_PORT_DISCARD_PFRM;
			else
				val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_DISCARD_PFRM;
		}

		if (mac_config->switch_port_config.mtu !=
		    VXGE_HAL_SWITCH_PORT_DEF_INITIAL_MTU) {

			val64 &= ~VXGE_HAL_RXMAC_CFG0_PORT_MAX_PYLD_LEN(0x3fff);

			val64 |= VXGE_HAL_RXMAC_CFG0_PORT_MAX_PYLD_LEN(
			    mac_config->switch_port_config.mtu);

		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_cfg0_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_cfg2_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (mac_config->switch_port_config.rmac_prom_en !=
		    VXGE_HAL_SWITCH_PORT_RMAC_PROM_EN_DEFAULT) {
			if (mac_config->switch_port_config.rmac_prom_en)
				val64 |= VXGE_HAL_RXMAC_CFG2_PORT_PROM_EN;
			else
				val64 &= ~VXGE_HAL_RXMAC_CFG2_PORT_PROM_EN;
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_cfg2_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_pause_cfg_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (mac_config->switch_port_config.rmac_pause_gen_en !=
		    VXGE_HAL_SWITCH_PORT_RMAC_PAUSE_GEN_EN_DEFAULT) {
			if (mac_config->switch_port_config.rmac_pause_gen_en)
				val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN;
			else
				val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN;

		}

		if (mac_config->switch_port_config.rmac_pause_rcv_en !=
		    VXGE_HAL_SWITCH_PORT_RMAC_PAUSE_RCV_EN_DEFAULT) {
			if (mac_config->switch_port_config.rmac_pause_rcv_en)
				val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN;
			else
				val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN;

		}

		if (mac_config->switch_port_config.rmac_pause_time !=
		    VXGE_HAL_SWITCH_PORT_DEF_RMAC_HIGH_PTIME) {
			val64 &=
			    ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_HIGH_PTIME(0xffff);

			val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_HIGH_PTIME(
			    mac_config->switch_port_config.rmac_pause_time);

		}

		if (mac_config->switch_port_config.rmac_pause_time !=
		    VXGE_HAL_SWITCH_PORT_RMAC_PAUSE_LIMITER_DEFAULT) {
			if (mac_config->switch_port_config.limiter_en)
				val64 |=
				    VXGE_HAL_RXMAC_PAUSE_CFG_PORT_LIMITER_EN;
			else
				val64 &=
				    ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_LIMITER_EN;

		}

		if (mac_config->switch_port_config.max_limit !=
		    VXGE_HAL_SWITCH_PORT_DEF_RMAC_MAX_LIMIT) {
			val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_MAX_LIMIT(0xff);

			val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_MAX_LIMIT(
			    mac_config->switch_port_config.max_limit);

		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_pause_cfg_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rxmac_link_util_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (mac_config->switch_port_config.rmac_util_period !=
		    VXGE_HAL_SWITCH_PORT_DEF_TMAC_UTIL_PERIOD) {
			val64 &=
			    ~VXGE_HAL_RXMAC_LINK_UTIL_PORT_RMAC_UTIL_CFG(0xf);

			val64 |= VXGE_HAL_RXMAC_LINK_UTIL_PORT_RMAC_UTIL_CFG(
			    mac_config->switch_port_config.rmac_util_period);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rxmac_link_util_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->txmac_cfg0_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		if (mac_config->switch_port_config.tmac_en)
			val64 |= VXGE_HAL_TXMAC_CFG0_PORT_TMAC_EN;
		else
			val64 &= ~VXGE_HAL_TXMAC_CFG0_PORT_TMAC_EN;

		if (mac_config->switch_port_config.tmac_pad !=
		    VXGE_HAL_SWITCH_PORT_TMAC_PAD_DEFAULT) {
			if (mac_config->switch_port_config.tmac_pad)
				val64 |= VXGE_HAL_TXMAC_CFG0_PORT_APPEND_PAD;
			else
				val64 &= ~VXGE_HAL_TXMAC_CFG0_PORT_APPEND_PAD;
		}

		if (mac_config->switch_port_config.tmac_pad_byte !=
		    VXGE_HAL_SWITCH_PORT_TMAC_PAD_DEFAULT) {
			val64 &= ~VXGE_HAL_TXMAC_CFG0_PORT_PAD_BYTE(0xff);

			val64 |= VXGE_HAL_TXMAC_CFG0_PORT_PAD_BYTE(
			    mac_config->switch_port_config.tmac_pad_byte);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->txmac_cfg0_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->txmac_link_util_port);

		if (mac_config->switch_port_config.tmac_util_period !=
		    VXGE_HAL_SWITCH_PORT_DEF_TMAC_UTIL_PERIOD) {
			val64 &=
			    ~VXGE_HAL_TXMAC_LINK_UTIL_PORT_TMAC_UTIL_CFG(0xf);

			val64 |= VXGE_HAL_TXMAC_LINK_UTIL_PORT_TMAC_UTIL_CFG(
			    mac_config->switch_port_config.tmac_util_period);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->txmac_link_util_port[
		    VXGE_HAL_MAC_SWITCH_PORT]);

	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->txmac_gen_cfg1);

	if (mac_config->tmac_perma_stop_en !=
	    VXGE_HAL_MAC_TMAC_PERMA_STOP_DEFAULT) {

		if (mac_config->tmac_perma_stop_en)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_TMAC_PERMA_STOP_EN;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_TMAC_PERMA_STOP_EN;

	}

	if (mac_config->tmac_tx_switch_dis !=
	    VXGE_HAL_MAC_TMAC_TX_SWITCH_DEFAULT) {

		if (mac_config->tmac_tx_switch_dis)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_TX_SWITCH_DISABLE;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_TX_SWITCH_DISABLE;

	}

	if (mac_config->tmac_lossy_switch_en !=
	    VXGE_HAL_MAC_TMAC_LOSSY_SWITCH_DEFAULT) {

		if (mac_config->tmac_lossy_switch_en)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_LOSSY_SWITCH;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_LOSSY_SWITCH;

	}

	if (mac_config->tmac_lossy_switch_en !=
	    VXGE_HAL_MAC_TMAC_LOSSY_WIRE_DEFAULT) {

		if (mac_config->tmac_lossy_wire_en)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_LOSSY_WIRE;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_LOSSY_WIRE;

	}

	if (mac_config->tmac_bcast_to_wire_dis !=
	    VXGE_HAL_MAC_TMAC_BCAST_TO_WIRE_DEFAULT) {

		if (mac_config->tmac_bcast_to_wire_dis)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_BLOCK_BCAST_TO_WIRE;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_BLOCK_BCAST_TO_WIRE;

	}

	if (mac_config->tmac_bcast_to_wire_dis !=
	    VXGE_HAL_MAC_TMAC_BCAST_TO_SWITCH_DEFAULT) {

		if (mac_config->tmac_bcast_to_switch_dis)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_BLOCK_BCAST_TO_SWITCH;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_BLOCK_BCAST_TO_SWITCH;

	}

	if (mac_config->tmac_host_append_fcs_en !=
	    VXGE_HAL_MAC_TMAC_HOST_APPEND_FCS_DEFAULT) {

		if (mac_config->tmac_host_append_fcs_en)
			val64 |= VXGE_HAL_TXMAC_GEN_CFG1_HOST_APPEND_FCS;
		else
			val64 &= ~VXGE_HAL_TXMAC_GEN_CFG1_HOST_APPEND_FCS;

	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->txmac_gen_cfg1);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg0);

	if (mac_config->rpa_ignore_frame_err !=
	    VXGE_HAL_MAC_RPA_IGNORE_FRAME_ERR_DEFAULT) {

		if (mac_config->rpa_ignore_frame_err)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG0_IGNORE_FRAME_ERR;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG0_IGNORE_FRAME_ERR;

	}

	if (mac_config->rpa_support_snap_ab_n !=
	    VXGE_HAL_MAC_RPA_SUPPORT_SNAP_AB_N_DEFAULT) {

		if (mac_config->rpa_support_snap_ab_n)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG0_SUPPORT_SNAP_AB_N;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG0_SUPPORT_SNAP_AB_N;

	}

	if (mac_config->rpa_search_for_hao !=
	    VXGE_HAL_MAC_RPA_SEARCH_FOR_HAO_DEFAULT) {

		if (mac_config->rpa_search_for_hao)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG0_SEARCH_FOR_HAO;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG0_SEARCH_FOR_HAO;

	}

	if (mac_config->rpa_support_ipv6_mobile_hdrs !=
	    VXGE_HAL_MAC_RPA_SUPPORT_IPV6_MOBILE_HDRS_DEFAULT) {

		if (mac_config->rpa_support_ipv6_mobile_hdrs)
			val64 |=
			    VXGE_HAL_RXMAC_RX_PA_CFG0_SUPPORT_MOBILE_IPV6_HDRS;
		else
			val64 &=
			    ~VXGE_HAL_RXMAC_RX_PA_CFG0_SUPPORT_MOBILE_IPV6_HDRS;

	}

	if (mac_config->rpa_ipv6_stop_searching !=
	    VXGE_HAL_MAC_RPA_IPV6_STOP_SEARCHING_DEFAULT) {

		if (mac_config->rpa_ipv6_stop_searching)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG0_IPV6_STOP_SEARCHING;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG0_IPV6_STOP_SEARCHING;

	}

	if (mac_config->rpa_no_ps_if_unknown !=
	    VXGE_HAL_MAC_RPA_NO_PS_IF_UNKNOWN_DEFAULT) {

		if (mac_config->rpa_no_ps_if_unknown)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG0_NO_PS_IF_UNKNOWN;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG0_NO_PS_IF_UNKNOWN;

	}

	if (mac_config->rpa_search_for_etype !=
	    VXGE_HAL_MAC_RPA_SEARCH_FOR_ETYPE_DEFAULT) {

		if (mac_config->rpa_search_for_etype)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG0_SEARCH_FOR_ETYPE;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG0_SEARCH_FOR_ETYPE;

	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg0);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->fau_pa_cfg);

	if (mac_config->rpa_repl_l4_comp_csum !=
	    VXGE_HAL_MAC_RPA_REPL_l4_COMP_CSUM_DEFAULT) {

		if (mac_config->rpa_repl_l4_comp_csum)
			val64 |= VXGE_HAL_FAU_PA_CFG_REPL_L4_COMP_CSUM;
		else
			val64 &= ~VXGE_HAL_FAU_PA_CFG_REPL_L4_COMP_CSUM;

	}

	if (mac_config->rpa_repl_l3_incl_cf !=
	    VXGE_HAL_MAC_RPA_REPL_L3_INCL_CF_DEFAULT) {

		if (mac_config->rpa_repl_l3_incl_cf)
			val64 |= VXGE_HAL_FAU_PA_CFG_REPL_L3_INCL_CF;
		else
			val64 &= ~VXGE_HAL_FAU_PA_CFG_REPL_L3_INCL_CF;

	}

	if (mac_config->rpa_repl_l3_comp_csum !=
	    VXGE_HAL_MAC_RPA_REPL_l3_COMP_CSUM_DEFAULT) {

		if (mac_config->rpa_repl_l3_comp_csum)
			val64 |= VXGE_HAL_FAU_PA_CFG_REPL_L3_COMP_CSUM;
		else
			val64 &= ~VXGE_HAL_FAU_PA_CFG_REPL_L3_COMP_CSUM;

	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->fau_pa_cfg);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg1);

	if (mac_config->rpa_repl_ipv4_tcp_incl_ph !=
	    VXGE_HAL_MAC_RPA_REPL_IPV4_TCP_INCL_PH_DEFAULT) {

		if (mac_config->rpa_repl_ipv4_tcp_incl_ph)
			val64 |=
			    VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV4_TCP_INCL_PH;
		else
			val64 &=
			    ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV4_TCP_INCL_PH;

	}

	if (mac_config->rpa_repl_ipv6_tcp_incl_ph !=
	    VXGE_HAL_MAC_RPA_REPL_IPV6_TCP_INCL_PH_DEFAULT) {

		if (mac_config->rpa_repl_ipv6_tcp_incl_ph)
			val64 |=
			    VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV6_TCP_INCL_PH;
		else
			val64 &=
			    ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV6_TCP_INCL_PH;

	}

	if (mac_config->rpa_repl_ipv4_udp_incl_ph !=
	    VXGE_HAL_MAC_RPA_REPL_IPV4_UDP_INCL_PH_DEFAULT) {

		if (mac_config->rpa_repl_ipv4_udp_incl_ph)
			val64 |=
			    VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV4_UDP_INCL_PH;
		else
			val64 &=
			    ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV4_UDP_INCL_PH;

	}

	if (mac_config->rpa_repl_ipv6_udp_incl_ph !=
	    VXGE_HAL_MAC_RPA_REPL_IPV6_UDP_INCL_PH_DEFAULT) {

		if (mac_config->rpa_repl_ipv6_udp_incl_ph)
			val64 |=
			    VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV6_UDP_INCL_PH;
		else
			val64 &=
			    ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_IPV6_UDP_INCL_PH;

	}

	if (mac_config->rpa_repl_l4_incl_cf !=
	    VXGE_HAL_MAC_RPA_REPL_L4_INCL_CF_DEFAULT) {

		if (mac_config->rpa_repl_l4_incl_cf)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_L4_INCL_CF;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_L4_INCL_CF;

	}

	if (mac_config->rpa_repl_strip_vlan_tag !=
	    VXGE_HAL_MAC_RPA_REPL_STRIP_VLAN_TAG_DEFAULT) {

		if (mac_config->rpa_repl_strip_vlan_tag)
			val64 |= VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_STRIP_VLAN_TAG;
		else
			val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_STRIP_VLAN_TAG;


	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg1);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->xmac_gen_cfg);

	if (mac_config->network_stability_period !=
	    VXGE_HAL_MAC_DEF_NETWORK_STABILITY_PERIOD) {

		val64 &= ~(VXGE_HAL_XMAC_GEN_CFG_PERIOD_NTWK_DOWN(0xf) |
		    VXGE_HAL_XMAC_GEN_CFG_PERIOD_NTWK_UP(0xf));

		val64 |= VXGE_HAL_XMAC_GEN_CFG_PERIOD_NTWK_DOWN(
		    mac_config->network_stability_period) |
		    VXGE_HAL_XMAC_GEN_CFG_PERIOD_NTWK_UP(
		    mac_config->network_stability_period);

	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->xmac_gen_cfg);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->tpa_global_cfg);

	if (mac_config->tpa_support_snap_ab_n !=
	    VXGE_HAL_MAC_TPA_SUPPORT_SNAP_AB_N_DEFAULT) {

		if (mac_config->tpa_support_snap_ab_n)
			val64 |= VXGE_HAL_TPA_GLOBAL_CFG_SUPPORT_SNAP_AB_N;
		else
			val64 &= ~VXGE_HAL_TPA_GLOBAL_CFG_SUPPORT_SNAP_AB_N;

	}

	if (mac_config->tpa_ecc_enable_n !=
	    VXGE_HAL_MAC_TPA_ECC_ENABLE_N_DEFAULT) {

		if (mac_config->tpa_ecc_enable_n)
			val64 |= VXGE_HAL_TPA_GLOBAL_CFG_ECC_ENABLE_N;
		else
			val64 &= ~VXGE_HAL_TPA_GLOBAL_CFG_ECC_ENABLE_N;

	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->tpa_global_cfg);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);

}

/*
 * __hal_mrpcim_lag_configure - Initialize LAG registers
 * @hldev: hal device.
 *
 * Initializes LAG registers
 *
 */
vxge_hal_status_e
__hal_mrpcim_lag_configure(__hal_device_t *hldev)
{
	u64 val64;
	u64 mac_addr;
	u32 i, j;
	vxge_hal_status_e status = VXGE_HAL_OK;
	vxge_hal_lag_config_t *lag_config =
	&hldev->header.config.mrpcim_config.lag_config;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("hldev = 0x"VXGE_OS_STXFMT,
	    (ptr_t) hldev);


	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_cfg);

	if (lag_config->lag_en == VXGE_HAL_LAG_LAG_EN_DEFAULT) {

		if (val64 & VXGE_HAL_LAG_CFG_EN)
			lag_config->lag_en = VXGE_HAL_LAG_LAG_EN_ENABLE;
		else
			lag_config->lag_en = VXGE_HAL_LAG_LAG_EN_DISABLE;

	}

	if (lag_config->lag_en == VXGE_HAL_LAG_LAG_EN_DISABLE) {

		if (val64 & VXGE_HAL_LAG_CFG_EN) {
			val64 &= ~VXGE_HAL_LAG_CFG_EN;
			vxge_os_pio_mem_write64(hldev->header.pdev,
			    hldev->header.regh0,
			    val64,
			    &hldev->mrpcim_reg->lag_cfg);
		}

		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
		    __FILE__, __func__, __LINE__);

		return (VXGE_HAL_OK);

	}

	if (lag_config->lag_mode != VXGE_HAL_LAG_LAG_MODE_DEFAULT) {
		val64 &= ~VXGE_HAL_LAG_CFG_MODE(0x3);
		val64 |= VXGE_HAL_LAG_CFG_MODE(lag_config->lag_mode);
	} else {
		lag_config->lag_mode = (u32) VXGE_HAL_LAG_CFG_GET_MODE(val64);
	}

	if (lag_config->la_mode_config.tx_discard !=
	    VXGE_HAL_LAG_TX_DISCARD_DEFAULT) {
		if (lag_config->la_mode_config.tx_discard ==
		    VXGE_HAL_LAG_TX_DISCARD_ENABLE)
			val64 |= VXGE_HAL_LAG_CFG_TX_DISCARD_BEHAV;
		else
			val64 &= ~VXGE_HAL_LAG_CFG_TX_DISCARD_BEHAV;
	}

	if (lag_config->la_mode_config.rx_discard !=
	    VXGE_HAL_LAG_RX_DISCARD_DEFAULT) {
		if (lag_config->la_mode_config.rx_discard ==
		    VXGE_HAL_LAG_RX_DISCARD_ENABLE)
			val64 |= VXGE_HAL_LAG_CFG_RX_DISCARD_BEHAV;
		else
			val64 &= ~VXGE_HAL_LAG_CFG_RX_DISCARD_BEHAV;
	}

	if (lag_config->sl_mode_config.pref_indiv_port !=
	    VXGE_HAL_LAG_PREF_INDIV_PORT_DEFAULT) {
		if (lag_config->sl_mode_config.pref_indiv_port ==
		    VXGE_HAL_LAG_RX_DISCARD_ENABLE)
			val64 |= VXGE_HAL_LAG_CFG_PREF_INDIV_PORT_NUM;
		else
			val64 &= ~VXGE_HAL_LAG_CFG_PREF_INDIV_PORT_NUM;
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_cfg);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_tx_cfg);

	if (lag_config->incr_tx_aggr_stats !=
	    VXGE_HAL_LAG_INCR_TX_AGGR_STATS_DEFAULT) {
		if (lag_config->incr_tx_aggr_stats ==
		    VXGE_HAL_LAG_INCR_TX_AGGR_STATS_ENABLE)
			val64 |= VXGE_HAL_LAG_TX_CFG_INCR_TX_AGGR_STATS;
		else
			val64 &= ~VXGE_HAL_LAG_TX_CFG_INCR_TX_AGGR_STATS;
	}

	if (lag_config->la_mode_config.distrib_alg_sel !=
	    VXGE_HAL_LAG_DISTRIB_ALG_SEL_DEFAULT) {
		val64 &= ~VXGE_HAL_LAG_TX_CFG_DISTRIB_ALG_SEL(0x3);
		val64 |= VXGE_HAL_LAG_TX_CFG_DISTRIB_ALG_SEL(
		    lag_config->la_mode_config.distrib_alg_sel);
		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    lag_config->la_mode_config.distrib_dest,
		    &hldev->mrpcim_reg->lag_distrib_dest);
	} else {
		lag_config->la_mode_config.distrib_alg_sel =
		    (u32) VXGE_HAL_LAG_TX_CFG_GET_DISTRIB_ALG_SEL(val64);
		lag_config->la_mode_config.distrib_dest =
		    vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_distrib_dest);
	}

	if (lag_config->la_mode_config.distrib_remap_if_fail !=
	    VXGE_HAL_LAG_DISTRIB_REMAP_IF_FAIL_DEFAULT) {
		if (lag_config->la_mode_config.distrib_remap_if_fail ==
		    VXGE_HAL_LAG_DISTRIB_REMAP_IF_FAIL_ENABLE)
			val64 |= VXGE_HAL_LAG_TX_CFG_DISTRIB_REMAP_IF_FAIL;
		else
			val64 &= ~VXGE_HAL_LAG_TX_CFG_DISTRIB_REMAP_IF_FAIL;
	}

	if (lag_config->la_mode_config.coll_max_delay !=
	    VXGE_HAL_LAG_DEF_COLL_MAX_DELAY) {
		val64 &= ~VXGE_HAL_LAG_TX_CFG_COLL_MAX_DELAY(0xffff);
		val64 |= VXGE_HAL_LAG_TX_CFG_DISTRIB_ALG_SEL(
		    lag_config->la_mode_config.coll_max_delay);
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_tx_cfg);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_active_passive_cfg);

	if (lag_config->ap_mode_config.hot_standby !=
	    VXGE_HAL_LAG_HOT_STANDBY_DEFAULT) {
		if (lag_config->ap_mode_config.hot_standby ==
		    VXGE_HAL_LAG_HOT_STANDBY_KEEP_UP_PORT)
			val64 |= VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_HOT_STANDBY;
		else
			val64 &= ~VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_HOT_STANDBY;
	}

	if (lag_config->ap_mode_config.lacp_decides !=
	    VXGE_HAL_LAG_LACP_DECIDES_DEFAULT) {
		if (lag_config->ap_mode_config.lacp_decides ==
		    VXGE_HAL_LAG_LACP_DECIDES_ENBALE)
			val64 |= VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_LACP_DECIDES;
		else
			val64 &= ~VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_LACP_DECIDES;
	}

	if (lag_config->ap_mode_config.pref_active_port !=
	    VXGE_HAL_LAG_PREF_ACTIVE_PORT_DEFAULT) {
		if (lag_config->ap_mode_config.pref_active_port ==
		    VXGE_HAL_LAG_PREF_ACTIVE_PORT_1)
			val64 |=
			    VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_PREF_ACTIVE_PORT_NUM;
		else
			val64 &=
			    ~VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_PREF_ACTIVE_PORT_NUM;
	}

	if (lag_config->ap_mode_config.auto_failback !=
	    VXGE_HAL_LAG_AUTO_FAILBACK_DEFAULT) {
		if (lag_config->ap_mode_config.auto_failback ==
		    VXGE_HAL_LAG_AUTO_FAILBACK_ENBALE)
			val64 |= VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_AUTO_FAILBACK;
		else
			val64 &= ~VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_AUTO_FAILBACK;
	}

	if (lag_config->ap_mode_config.failback_en !=
	    VXGE_HAL_LAG_FAILBACK_EN_DEFAULT) {
		if (lag_config->ap_mode_config.failback_en ==
		    VXGE_HAL_LAG_FAILBACK_EN_ENBALE)
			val64 |= VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_FAILBACK_EN;
		else
			val64 &= ~VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_FAILBACK_EN;
	}

	if (lag_config->ap_mode_config.cold_failover_timeout !=
	    VXGE_HAL_LAG_DEF_COLD_FAILOVER_TIMEOUT) {
		val64 &= ~VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_COLD_FAILOVER_TIMEOUT(
		    0xffff);
		val64 |= VXGE_HAL_LAG_ACTIVE_PASSIVE_CFG_COLD_FAILOVER_TIMEOUT(
		    lag_config->ap_mode_config.cold_failover_timeout);
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_active_passive_cfg);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_lacp_cfg);

	if (lag_config->lacp_config.lacp_en !=
	    VXGE_HAL_LAG_LACP_EN_DEFAULT) {
		if (lag_config->lacp_config.lacp_en ==
		    VXGE_HAL_LAG_LACP_EN_ENABLE)
			val64 |= VXGE_HAL_LAG_LACP_CFG_EN;
		else
			val64 &= ~VXGE_HAL_LAG_LACP_CFG_EN;
	}

	if (lag_config->lacp_config.lacp_begin !=
	    VXGE_HAL_LAG_LACP_BEGIN_DEFAULT) {
		if (lag_config->lacp_config.lacp_begin ==
		    VXGE_HAL_LAG_LACP_BEGIN_RESET)
			val64 |= VXGE_HAL_LAG_LACP_CFG_LACP_BEGIN;
		else
			val64 &= ~VXGE_HAL_LAG_LACP_CFG_LACP_BEGIN;
	}

	if (lag_config->lacp_config.discard_lacp !=
	    VXGE_HAL_LAG_DISCARD_LACP_DEFAULT) {
		if (lag_config->lacp_config.discard_lacp ==
		    VXGE_HAL_LAG_DISCARD_LACP_ENABLE)
			val64 |= VXGE_HAL_LAG_LACP_CFG_DISCARD_LACP;
		else
			val64 &= ~VXGE_HAL_LAG_LACP_CFG_DISCARD_LACP;
	}

	if (lag_config->lacp_config.liberal_len_chk !=
	    VXGE_HAL_LAG_LIBERAL_LEN_CHK_DEFAULT) {
		if (lag_config->lacp_config.liberal_len_chk ==
		    VXGE_HAL_LAG_LIBERAL_LEN_CHK_ENABLE)
			val64 |= VXGE_HAL_LAG_LACP_CFG_LIBERAL_LEN_CHK;
		else
			val64 &= ~VXGE_HAL_LAG_LACP_CFG_LIBERAL_LEN_CHK;
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_lacp_cfg);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_marker_cfg);

	if (lag_config->lacp_config.marker_gen_recv_en !=
	    VXGE_HAL_LAG_MARKER_GEN_RECV_EN_DEFAULT) {
		if (lag_config->lacp_config.marker_gen_recv_en ==
		    VXGE_HAL_LAG_MARKER_GEN_RECV_EN_ENABLE)
			val64 |= VXGE_HAL_LAG_MARKER_CFG_GEN_RCVR_EN;
		else
			val64 &= ~VXGE_HAL_LAG_MARKER_CFG_GEN_RCVR_EN;
	}

	if (lag_config->lacp_config.marker_resp_en !=
	    VXGE_HAL_LAG_MARKER_RESP_EN_DEFAULT) {
		if (lag_config->lacp_config.marker_resp_en ==
		    VXGE_HAL_LAG_MARKER_RESP_EN_ENABLE)
			val64 |= VXGE_HAL_LAG_MARKER_CFG_RESP_EN;
		else
			val64 &= ~VXGE_HAL_LAG_MARKER_CFG_RESP_EN;
	}

	if (lag_config->lacp_config.marker_resp_timeout !=
	    VXGE_HAL_LAG_DEF_MARKER_RESP_TIMEOUT) {
		val64 &= ~VXGE_HAL_LAG_MARKER_CFG_RESP_TIMEOUT(0xffff);
		val64 |= VXGE_HAL_LAG_MARKER_CFG_RESP_TIMEOUT(
		    lag_config->lacp_config.marker_resp_timeout);
	}

	if (lag_config->lacp_config.slow_proto_mrkr_min_interval !=
	    VXGE_HAL_LAG_DEF_SLOW_PROTO_MRKR_MIN_INTERVAL) {
		val64 &= ~VXGE_HAL_LAG_MARKER_CFG_SLOW_PROTO_MRKR_MIN_INTERVAL(
		    0xffff);
		val64 |= VXGE_HAL_LAG_MARKER_CFG_SLOW_PROTO_MRKR_MIN_INTERVAL(
		    lag_config->lacp_config.slow_proto_mrkr_min_interval);
	}

	if (lag_config->lacp_config.throttle_mrkr_resp !=
	    VXGE_HAL_LAG_THROTTLE_MRKR_RESP_DEFAULT) {
		if (lag_config->lacp_config.throttle_mrkr_resp ==
		    VXGE_HAL_LAG_THROTTLE_MRKR_RESP_ENABLE)
			val64 |= VXGE_HAL_LAG_MARKER_CFG_THROTTLE_MRKR_RESP;
		else
			val64 &= ~VXGE_HAL_LAG_MARKER_CFG_THROTTLE_MRKR_RESP;
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_marker_cfg);

	for (i = 0; i < VXGE_HAL_LAG_PORT_MAX_PORTS; i++) {

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_port_cfg[i]);

		if (lag_config->port_config[i].lag_en !=
		    VXGE_HAL_LAG_PORT_LAG_EN_DEFAULT) {
			if (lag_config->port_config[i].lag_en ==
			    VXGE_HAL_LAG_PORT_LAG_EN_ENABLE)
				val64 |= VXGE_HAL_LAG_PORT_CFG_EN;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_CFG_EN;
		}

		if (lag_config->port_config[i].discard_slow_proto !=
		    VXGE_HAL_LAG_PORT_DISCARD_SLOW_PROTO_DEFAULT) {
			if (lag_config->port_config[i].discard_slow_proto ==
			    VXGE_HAL_LAG_PORT_DISCARD_SLOW_PROTO_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_CFG_DISCARD_SLOW_PROTO;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_CFG_DISCARD_SLOW_PROTO;
		}

		if (lag_config->port_config[i].host_chosen_aggr !=
		    VXGE_HAL_LAG_PORT_HOST_CHOSEN_AGGR_DEFAULT) {
			if (lag_config->port_config[i].host_chosen_aggr ==
			    VXGE_HAL_LAG_PORT_HOST_CHOSEN_AGGR_1)
				val64 |=
				    VXGE_HAL_LAG_PORT_CFG_HOST_CHOSEN_AGGR;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_CFG_HOST_CHOSEN_AGGR;
		}

		if (lag_config->port_config[i].discard_unknown_slow_proto !=
		    VXGE_HAL_LAG_PORT_DISCARD_UNKNOWN_SLOW_PROTO_DEFAULT) {
			if (lag_config->port_config[i].discard_unknown_slow_proto ==
			    VXGE_HAL_LAG_PORT_DISCARD_UNKNOWN_SLOW_PROTO_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_CFG_DISCARD_UNKNOWN_SLOW_PROTO;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_CFG_DISCARD_UNKNOWN_SLOW_PROTO;
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_port_cfg[i]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_port_actor_admin_cfg[i]);

		if (lag_config->port_config[i].actor_port_num !=
		    VXGE_HAL_LAG_PORT_DEF_ACTOR_PORT_NUM) {
			val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_PORT_NUM(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_PORT_NUM(
			    lag_config->port_config[i].actor_port_num);
		}

		if (lag_config->port_config[i].actor_port_priority !=
		    VXGE_HAL_LAG_PORT_DEF_ACTOR_PORT_PRIORITY) {
			val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_PORT_PRI(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_PORT_PRI(
			    lag_config->port_config[i].actor_port_priority);
		}

		if (lag_config->port_config[i].actor_key_10g !=
		    VXGE_HAL_LAG_PORT_DEF_ACTOR_KEY_10G) {
			val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_KEY_10G(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_KEY_10G(
			    lag_config->port_config[i].actor_key_10g);
		}

		if (lag_config->port_config[i].actor_key_1g !=
		    VXGE_HAL_LAG_PORT_DEF_ACTOR_KEY_1G) {
			val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_KEY_1G(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_CFG_KEY_1G(
			    lag_config->port_config[i].actor_key_1g);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_port_actor_admin_cfg[i]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_port_actor_admin_state[i]);

		if (lag_config->port_config[i].actor_lacp_activity !=
		    VXGE_HAL_LAG_PORT_ACTOR_LACP_ACTIVITY_DEFAULT) {
			if (lag_config->port_config[i].actor_lacp_activity ==
			    VXGE_HAL_LAG_PORT_ACTOR_LACP_ACTIVITY_ACTIVE)
				val64 |=
				    VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_LACP_ACTIVITY;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_LACP_ACTIVITY;
		}

		if (lag_config->port_config[i].actor_lacp_timeout !=
		    VXGE_HAL_LAG_PORT_ACTOR_LACP_ACTIVITY_DEFAULT) {
			if (lag_config->port_config[i].actor_lacp_timeout ==
			    VXGE_HAL_LAG_PORT_ACTOR_LACP_TIMEOUT_SHORT)
				val64 |=
				    VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_LACP_TIMEOUT;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_LACP_TIMEOUT;
		}

		if (lag_config->port_config[i].actor_aggregation !=
		    VXGE_HAL_LAG_PORT_ACTOR_AGGREGATION_DEFAULT) {
			if (lag_config->port_config[i].actor_aggregation ==
			    VXGE_HAL_LAG_PORT_ACTOR_AGGREGATION_AGGREGATEABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_AGGREGATION;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_AGGREGATION;
		}

		if (lag_config->port_config[i].actor_synchronization !=
		    VXGE_HAL_LAG_PORT_ACTOR_SYNCHRONIZATION_DEFAULT) {
			if (lag_config->port_config[i].actor_aggregation ==
			    VXGE_HAL_LAG_PORT_ACTOR_SYNCHRONIZATION_IN_SYNC)
				val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_SYNCHRONIZATION;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_SYNCHRONIZATION;
		}

		if (lag_config->port_config[i].actor_collecting !=
		    VXGE_HAL_LAG_PORT_ACTOR_COLLECTING_DEFAULT) {
			if (lag_config->port_config[i].actor_collecting ==
			    VXGE_HAL_LAG_PORT_ACTOR_COLLECTING_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_COLLECTING;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_COLLECTING;
		}

		if (lag_config->port_config[i].actor_distributing !=
		    VXGE_HAL_LAG_PORT_ACTOR_DISTRIBUTING_DEFAULT) {
			if (lag_config->port_config[i].actor_distributing ==
			    VXGE_HAL_LAG_PORT_ACTOR_DISTRIBUTING_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_DISTRIBUTING;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_DISTRIBUTING;
		}

		if (lag_config->port_config[i].actor_defaulted !=
		    VXGE_HAL_LAG_PORT_ACTOR_DEFAULTED_DEFAULT) {
			if (lag_config->port_config[i].actor_defaulted ==
			    VXGE_HAL_LAG_PORT_ACTOR_NOT_DEFAULTED)
				val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_DEFAULTED;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_DEFAULTED;
		}

		if (lag_config->port_config[i].actor_expired !=
		    VXGE_HAL_LAG_PORT_ACTOR_EXPIRED_DEFAULT) {
			if (lag_config->port_config[i].actor_expired ==
			    VXGE_HAL_LAG_PORT_ACTOR_NOT_EXPIRED)
				val64 |= VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_EXPIRED;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_ACTOR_ADMIN_STATE_EXPIRED;
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_port_actor_admin_state[i]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_port_partner_admin_cfg[i]);

		if (lag_config->port_config[i].partner_sys_pri !=
		    VXGE_HAL_LAG_PORT_DEF_PARTNER_SYS_PRI) {
			val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_SYS_PRI(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_SYS_PRI(
			    lag_config->port_config[i].partner_sys_pri);
		}

		if (lag_config->port_config[i].partner_key !=
		    VXGE_HAL_LAG_PORT_DEF_PARTNER_KEY) {
			val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_KEY(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_KEY(
			    lag_config->port_config[i].partner_key);
		}

		if (lag_config->port_config[i].partner_port_num !=
		    VXGE_HAL_LAG_PORT_DEF_PARTNER_PORT_NUM) {
			val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_PORT_NUM(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_PORT_NUM(
			    lag_config->port_config[i].partner_port_num);
		}

		if (lag_config->port_config[i].partner_port_priority !=
		    VXGE_HAL_LAG_PORT_DEF_PARTNER_PORT_PRIORITY) {
			val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_PORT_PRI(
			    0xffff);
			val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_CFG_PORT_PRI(
			    lag_config->port_config[i].actor_port_priority);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_port_partner_admin_cfg[i]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_port_partner_admin_state[i]);

		if (lag_config->port_config[i].partner_lacp_activity !=
		    VXGE_HAL_LAG_PORT_PARTNER_LACP_ACTIVITY_DEFAULT) {
			if (lag_config->port_config[i].partner_lacp_activity ==
			    VXGE_HAL_LAG_PORT_PARTNER_LACP_ACTIVITY_ACTIVE)
				val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_LACP_ACTIVITY;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_LACP_ACTIVITY;
		}

		if (lag_config->port_config[i].partner_lacp_timeout !=
		    VXGE_HAL_LAG_PORT_PARTNER_LACP_ACTIVITY_DEFAULT) {
			if (lag_config->port_config[i].partner_lacp_timeout ==
			    VXGE_HAL_LAG_PORT_PARTNER_LACP_TIMEOUT_SHORT)
				val64 |=
				    VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_LACP_TIMEOUT;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_LACP_TIMEOUT;
		}

		if (lag_config->port_config[i].partner_aggregation !=
		    VXGE_HAL_LAG_PORT_PARTNER_AGGREGATION_DEFAULT) {
			if (lag_config->port_config[i].partner_aggregation ==
			    VXGE_HAL_LAG_PORT_PARTNER_AGGREGATION_AGGREGATEABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_AGGREGATION;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_AGGREGATION;
		}

		if (lag_config->port_config[i].partner_synchronization !=
		    VXGE_HAL_LAG_PORT_PARTNER_SYNCHRONIZATION_DEFAULT) {
			if (lag_config->port_config[i].partner_aggregation ==
			    VXGE_HAL_LAG_PORT_PARTNER_SYNCHRONIZATION_IN_SYNC)
				val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_SYNCHRONIZATION;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_SYNCHRONIZATION;
		}

		if (lag_config->port_config[i].partner_collecting !=
		    VXGE_HAL_LAG_PORT_PARTNER_COLLECTING_DEFAULT) {
			if (lag_config->port_config[i].partner_collecting ==
			    VXGE_HAL_LAG_PORT_PARTNER_COLLECTING_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_COLLECTING;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_COLLECTING;
		}

		if (lag_config->port_config[i].partner_distributing !=
		    VXGE_HAL_LAG_PORT_PARTNER_DISTRIBUTING_DEFAULT) {
			if (lag_config->port_config[i].partner_distributing ==
			    VXGE_HAL_LAG_PORT_PARTNER_DISTRIBUTING_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_DISTRIBUTING;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_DISTRIBUTING;
		}

		if (lag_config->port_config[i].partner_defaulted !=
		    VXGE_HAL_LAG_PORT_PARTNER_DEFAULTED_DEFAULT) {
			if (lag_config->port_config[i].partner_defaulted ==
			    VXGE_HAL_LAG_PORT_PARTNER_NOT_DEFAULTED)
				val64 |=
				    VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_DEFAULTED;
			else
				val64 &=
				    ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_DEFAULTED;
		}

		if (lag_config->port_config[i].partner_expired !=
		    VXGE_HAL_LAG_PORT_PARTNER_EXPIRED_DEFAULT) {
			if (lag_config->port_config[i].partner_expired ==
			    VXGE_HAL_LAG_PORT_PARTNER_NOT_EXPIRED)
				val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_EXPIRED;
			else
				val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_STATE_EXPIRED;
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_port_partner_admin_state[i]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_port_partner_admin_sys_id[i]);

		mac_addr = 0;

		for (j = 0; j < VXGE_HAL_ETH_ALEN; j++) {
			mac_addr <<= 8;
			mac_addr |=
			    (u8) lag_config->port_config[i].partner_mac_addr[j];
		}

		if (mac_addr != 0xffffffffffffULL) {
			val64 &= ~VXGE_HAL_LAG_PORT_PARTNER_ADMIN_SYS_ID_ADDR(
			    0xffffffffffffULL);
			val64 |= VXGE_HAL_LAG_PORT_PARTNER_ADMIN_SYS_ID_ADDR(
			    mac_addr);
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_port_partner_admin_sys_id[i]);

	}

	for (i = 0; i < VXGE_HAL_LAG_AGGR_MAX_PORTS; i++) {

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_aggr_id_cfg[i]);

		val64 &= ~VXGE_HAL_LAG_AGGR_ID_CFG_ID(0xffff);
		val64 |= VXGE_HAL_LAG_AGGR_ID_CFG_ID(
		    lag_config->aggr_config[i].aggr_id);

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_aggr_id_cfg[i]);

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_aggr_addr_cfg[i]);

		mac_addr = 0;

		for (j = 0; j < VXGE_HAL_ETH_ALEN; j++) {
			mac_addr <<= 8;
			mac_addr |= (u8) lag_config->aggr_config[i].mac_addr[j];
		}

		if (mac_addr != 0xffffffffffffULL) {
			val64 &=
			    ~VXGE_HAL_LAG_AGGR_ADDR_CFG_ADDR(0xffffffffffffULL);
			val64 |= VXGE_HAL_LAG_AGGR_ADDR_CFG_ADDR(mac_addr);
		}

		if (lag_config->aggr_config[i].use_port_mac_addr !=
		    VXGE_HAL_LAG_AGGR_USE_PORT_MAC_ADDR_DEFAULT) {
			if (lag_config->aggr_config[i].use_port_mac_addr ==
			    VXGE_HAL_LAG_AGGR_USE_PORT_MAC_ADDR_ENABLE)
				val64 |=
				    VXGE_HAL_LAG_AGGR_ADDR_CFG_USE_PORT_ADDR;
			else
				val64 &=
				    ~VXGE_HAL_LAG_AGGR_ADDR_CFG_USE_PORT_ADDR;
		}

		if (lag_config->aggr_config[i].mac_addr_sel !=
		    VXGE_HAL_LAG_AGGR_MAC_ADDR_SEL_DEFAULT) {
			if (lag_config->aggr_config[i].mac_addr_sel ==
			    VXGE_HAL_LAG_AGGR_MAC_ADDR_SEL_PORT_1)
				val64 |= VXGE_HAL_LAG_AGGR_ADDR_CFG_ADDR_SEL;
			else
				val64 &= ~VXGE_HAL_LAG_AGGR_ADDR_CFG_ADDR_SEL;
		}

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_aggr_addr_cfg[i]);

		if (lag_config->aggr_config[i].admin_key ==
		    VXGE_HAL_LAG_AGGR_DEF_ADMIN_KEY) {
			val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
			    hldev->header.regh0,
			    &hldev->mrpcim_reg->lag_aggr_admin_key[i]);

			val64 &= ~VXGE_HAL_LAG_AGGR_ADMIN_KEY_KEY(0xffff);
			val64 |= VXGE_HAL_LAG_AGGR_ADMIN_KEY_KEY(
			    lag_config->aggr_config[i].admin_key);

			vxge_os_pio_mem_write64(hldev->header.pdev,
			    hldev->header.regh0,
			    val64,
			    &hldev->mrpcim_reg->lag_aggr_admin_key[i]);
		}
	}

	if (lag_config->sys_pri != VXGE_HAL_LAG_DEF_SYS_PRI) {
		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->lag_sys_cfg);

		val64 &= ~VXGE_HAL_LAG_SYS_CFG_SYS_PRI(0xffff);
		val64 |= VXGE_HAL_LAG_SYS_CFG_SYS_PRI(
		    lag_config->sys_pri);

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->lag_sys_cfg);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_sys_id);

	mac_addr = 0;

	for (j = 0; j < VXGE_HAL_ETH_ALEN; j++) {
		mac_addr <<= 8;
		mac_addr |= (u8) lag_config->mac_addr[j];
	}

	if (mac_addr != 0xffffffffffffULL) {
		val64 &= ~VXGE_HAL_LAG_SYS_ID_ADDR(0xffffffffffffULL);
		val64 |= VXGE_HAL_LAG_SYS_ID_ADDR(mac_addr);
	}

	if (lag_config->use_port_mac_addr !=
	    VXGE_HAL_LAG_USE_PORT_MAC_ADDR_DEFAULT) {
		if (lag_config->use_port_mac_addr ==
		    VXGE_HAL_LAG_USE_PORT_MAC_ADDR_ENABLE)
			val64 |= VXGE_HAL_LAG_SYS_ID_USE_PORT_ADDR;
		else
			val64 &= ~VXGE_HAL_LAG_SYS_ID_USE_PORT_ADDR;
	}

	if (lag_config->mac_addr_sel != VXGE_HAL_LAG_MAC_ADDR_SEL_DEFAULT) {
		if (lag_config->mac_addr_sel ==
		    VXGE_HAL_LAG_MAC_ADDR_SEL_PORT_1)
			val64 |= VXGE_HAL_LAG_SYS_ID_ADDR_SEL;
		else
			val64 &= ~VXGE_HAL_LAG_SYS_ID_ADDR_SEL;
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_sys_id);


	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_aggr_alt_admin_key);

	if (lag_config->ap_mode_config.alt_admin_key !=
	    VXGE_HAL_LAG_DEF_ALT_ADMIN_KEY) {
		val64 &= ~VXGE_HAL_LAG_AGGR_ALT_ADMIN_KEY_KEY(0xffff);
		val64 |= VXGE_HAL_LAG_AGGR_ALT_ADMIN_KEY_KEY(
		    lag_config->ap_mode_config.alt_admin_key);
	}

	if (lag_config->ap_mode_config.alt_aggr !=
	    VXGE_HAL_LAG_ALT_AGGR_DEFAULT) {
		if (lag_config->ap_mode_config.alt_aggr ==
		    VXGE_HAL_LAG_ALT_AGGR_1)
			val64 |= VXGE_HAL_LAG_AGGR_ALT_ADMIN_KEY_ALT_AGGR;
		else
			val64 &= ~VXGE_HAL_LAG_AGGR_ALT_ADMIN_KEY_ALT_AGGR;
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_aggr_alt_admin_key);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_timer_cfg_1);

	if (lag_config->fast_per_time != VXGE_HAL_LAG_DEF_FAST_PER_TIME) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_1_FAST_PER(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_1_FAST_PER(
		    lag_config->fast_per_time);
	}

	if (lag_config->slow_per_time != VXGE_HAL_LAG_DEF_SLOW_PER_TIME) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_1_SLOW_PER(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_1_SLOW_PER(
		    lag_config->slow_per_time);
	}

	if (lag_config->short_timeout != VXGE_HAL_LAG_DEF_SHORT_TIMEOUT) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_1_SHORT_TIMEOUT(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_1_SHORT_TIMEOUT(
		    lag_config->short_timeout);
	}

	if (lag_config->long_timeout != VXGE_HAL_LAG_DEF_LONG_TIMEOUT) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_1_LONG_TIMEOUT(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_1_LONG_TIMEOUT(
		    lag_config->short_timeout);
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_timer_cfg_1);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->lag_timer_cfg_2);

	if (lag_config->churn_det_time != VXGE_HAL_LAG_DEF_CHURN_DET_TIME) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_2_CHURN_DET(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_2_CHURN_DET(
		    lag_config->churn_det_time);
	}

	if (lag_config->aggr_wait_time != VXGE_HAL_LAG_DEF_AGGR_WAIT_TIME) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_2_AGGR_WAIT(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_2_AGGR_WAIT(
		    lag_config->slow_per_time);
	}

	if (lag_config->short_timer_scale !=
	    VXGE_HAL_LAG_SHORT_TIMER_SCALE_DEFAULT) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_2_SHORT_TIMER_SCALE(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_2_SHORT_TIMER_SCALE(
		    lag_config->short_timer_scale);
	}

	if (lag_config->long_timer_scale !=
	    VXGE_HAL_LAG_LONG_TIMER_SCALE_DEFAULT) {
		val64 &= ~VXGE_HAL_LAG_TIMER_CFG_2_LONG_TIMER_SCALE(0xffff);
		val64 |= VXGE_HAL_LAG_TIMER_CFG_2_LONG_TIMER_SCALE(
		    lag_config->long_timer_scale);
	}

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->lag_timer_cfg_2);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);

}

/*
 * __hal_mrpcim_get_vpd_data - Getting vpd_data.
 *
 * @hldev: HAL device handle.
 *
 * Getting  product name and serial number from vpd capabilites structure
 *
 */
void
__hal_mrpcim_get_vpd_data(__hal_device_t *hldev)
{
	u8 *vpd_data;
	u16 data;
	u32 data32;
	u32 i, j, count, fail = 0;
	u32 addr_offset, data_offset;
	u32 max_count = hldev->header.config.device_poll_millis * 10;

	vxge_assert(hldev);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("hldev = 0x"VXGE_OS_STXFMT,
	    (ptr_t) hldev);

	addr_offset = hldev->pci_caps.vpd_cap_offset +
	    vxge_offsetof(vxge_hal_vpid_capability_le_t, vpd_address);

	data_offset = hldev->pci_caps.vpd_cap_offset +
	    vxge_offsetof(vxge_hal_vpid_capability_le_t, vpd_data);

	vxge_os_strlcpy((char *) hldev->mrpcim->vpd_data.product_name,
	    "10 Gigabit Ethernet Adapter",
	    sizeof(hldev->mrpcim->vpd_data.product_name));
	vxge_os_strlcpy((char *) hldev->mrpcim->vpd_data.serial_num,
	    "not available",
	    sizeof(hldev->mrpcim->vpd_data.serial_num));

	if (hldev->func_id != 0) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return;
	}
	vpd_data = (u8 *) vxge_os_malloc(hldev->header.pdev,
	    VXGE_HAL_VPD_BUFFER_SIZE + 16);
	if (vpd_data == 0)
		return;

	for (i = 0; i < VXGE_HAL_VPD_BUFFER_SIZE; i += 4) {
		vxge_os_pci_write16(hldev->header.pdev,
		    hldev->header.cfgh,
		    addr_offset, (u16) i);
		for (count = 0; count < max_count; count++) {
			vxge_os_udelay(100);
			(void) __hal_vpath_pci_read(hldev,
			    hldev->first_vp_id,
			    addr_offset, 2, &data);
			if (data & VXGE_HAL_PCI_VPID_COMPL_FALG)
				break;
		}

		if (count >= max_count) {
			vxge_hal_info_log_device("%s:ERR, \
			    Reading VPD data failed", __func__);
			fail = 1;
			break;
		}
		(void) __hal_vpath_pci_read(hldev,
		    hldev->first_vp_id,
		    data_offset,
		    4,
		    &data32);

		for (j = 0; j < 4; j++) {
			vpd_data[i + j] = (u8) (data32 & 0xff);
			data32 >>= 8;
		}
	}

	if (!fail) {

		/* read serial number of adapter */
		for (count = 0; count < VXGE_HAL_VPD_BUFFER_SIZE; count++) {
			if ((vpd_data[count] == 'S') &&
			    (vpd_data[count + 1] == 'N') &&
			    (vpd_data[count + 2] < VXGE_HAL_VPD_LENGTH)) {
				(void) vxge_os_memzero(
				    hldev->mrpcim->vpd_data.serial_num,
				    VXGE_HAL_VPD_LENGTH);
				(void) vxge_os_memcpy(
				    hldev->mrpcim->vpd_data.serial_num,
				    &vpd_data[count + 3],
				    vpd_data[count + 2]);
				break;
			}
		}

		if (vpd_data[1] < VXGE_HAL_VPD_LENGTH) {
			(void) vxge_os_memzero(
			    hldev->mrpcim->vpd_data.product_name, vpd_data[1]);
			(void) vxge_os_memcpy(hldev->mrpcim->vpd_data.product_name,
			    &vpd_data[3], vpd_data[1]);
		}
	}

	vxge_os_free(hldev->header.pdev,
	    vpd_data,
	    VXGE_HAL_VPD_BUFFER_SIZE + 16);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, fail);
}

/*
 * __hal_mrpcim_rts_table_access - Get/Set the entries from RTS access tables
 * @devh: Device handle.
 * @action: Write Enable. 0 - Read Operation; 1 - Write Operation
 * @rts_table: Data structure select. Identifies the RTS data structure
 *		(i.e. lookup table) to access.
 *		0; DA; Destination Address
 *		1; VID; VLAN ID
 *		2; ETYPE; Ethertype
 *		3; PN; Layer 4 Port Number
 *		4; RANGE_PN; Range of Layer 4 Port Numbers
 *		5; RTH_GEN_CFG; Receive-Traffic Hashing General Configuration
 *		6; RTH_SOLO_IT; Receive-Traffic Hashing Indirection Table
 *		(Single Bucket Programming)
 *		7; RTH_JHASH_CFG; Receive-Traffic Hashing Jenkins Hash Config
 *		8; RTH_MASK; Receive-Traffic Hashing Mask
 *		9; RTH_KEY; Receive-Traffic Hashing Key
 *		10; QOS; VLAN Quality of Service
 *		11; DS; IP Differentiated Services
 * @offset: Offset (into the data structure) to execute the command on.
 * @data1: Pointer to the data 1 to be read from the table
 * @data2: Pointer to the data 2 to be read from the table
 * @vpath_vector: Identifies the candidate VPATH(s) for the given entry.
 *		These VPATH(s) determine the set of target destinations for
 *		a frame that matches this steering entry. Any or all bits
 *		can be set, which handles 16+1 virtual paths in an 'n-hot'
 *		basis. VPATH 0 is the MSbit.
 *
 * Read from the RTS table
 *
 */
vxge_hal_status_e
__hal_mrpcim_rts_table_access(
    vxge_hal_device_h devh,
    u32 action,
    u32 rts_table,
    u32 offset,
    u64 *data1,
    u64 *data2,
    u64 *vpath_vector)
{
	u64 val64;
	__hal_device_t *hldev;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert((devh != NULL) && (data1 != NULL) &&
	    (data2 != NULL) && (vpath_vector != NULL));

	hldev = (__hal_device_t *) devh;

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", action = %d, rts_table = %d, "
	    "offset = %d, data1 = 0x"VXGE_OS_STXFMT", "
	    "data2 = 0x"VXGE_OS_STXFMT", vpath_vector = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, action, rts_table, offset, (ptr_t) data1,
	    (ptr_t) data2, (ptr_t) vpath_vector);

	val64 = VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL(rts_table) |
	    VXGE_HAL_RTS_MGR_STEER_CTRL_STROBE |
	    VXGE_HAL_RTS_MGR_STEER_CTRL_OFFSET(offset);

	if (action == VXGE_HAL_RTS_MGR_STEER_CTRL_WE_WRITE)
		val64 = VXGE_HAL_RTS_MGR_STEER_CTRL_WE;

	if ((rts_table ==
	    VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL_RTH_SOLO_IT) ||
	    (rts_table ==
	    VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL_RTH_MULTI_IT) ||
	    (rts_table ==
	    VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL_RTH_MASK) ||
	    (rts_table ==
	    VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL_RTH_KEY)) {
		val64 |= VXGE_HAL_RTS_MGR_STEER_CTRL_TABLE_SEL;
	}

	vxge_hal_pio_mem_write32_lower(hldev->header.pdev,
	    hldev->header.regh0,
	    (u32) bVAL32(val64, 32),
	    &hldev->mrpcim_reg->rts_mgr_steer_ctrl);

	vxge_os_wmb();

	vxge_hal_pio_mem_write32_upper(hldev->header.pdev,
	    hldev->header.regh0,
	    (u32) bVAL32(val64, 0),
	    &hldev->mrpcim_reg->rts_mgr_steer_ctrl);

	vxge_os_wmb();

	status = vxge_hal_device_register_poll(
	    hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->rts_mgr_steer_ctrl, 0,
	    VXGE_HAL_RTS_MGR_STEER_CTRL_STROBE,
	    WAIT_FACTOR * hldev->header.config.device_poll_millis);

	if (status != VXGE_HAL_OK) {

		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	val64 = vxge_os_pio_mem_read64(
	    hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->rts_mgr_steer_ctrl);

	if ((val64 & VXGE_HAL_RTS_MGR_STEER_CTRL_RMACJ_STATUS) &&
	    (action == VXGE_HAL_RTS_MGR_STEER_CTRL_WE_READ)) {

		*data1 = vxge_os_pio_mem_read64(
		    hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rts_mgr_steer_data0);

		*data2 = vxge_os_pio_mem_read64(
		    hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rts_mgr_steer_data1);

		*vpath_vector = vxge_os_pio_mem_read64(
		    hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rts_mgr_steer_vpath_vector);

		status = VXGE_HAL_OK;

	} else {
		status = VXGE_HAL_FAIL;
	}


	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
	    __FILE__, __func__, __LINE__,
	    status);
	return (status);
}

/*
 * vxge_hal_mrpcim_mac_addr_add - Add the mac address entry
 *				into MAC address table.
 * @devh: Device handle.
 * @offset: Index into the DA table to add the mac address.
 * @macaddr: MAC address to be added for this vpath into the list
 * @macaddr_mask: MAC address mask for macaddr
 * @vpath_vector: Bit mask specifying the vpaths to which
 *		the mac address applies
 * @duplicate_mode: Duplicate MAC address add mode. Please see
 *		vxge_hal_vpath_mac_addr_add_mode_e {}
 *
 * Adds the given mac address, mac address mask and vpath vector into the list
 *
 * see also: vxge_hal_mrpcim_mac_addr_get
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_mac_addr_add(
    vxge_hal_device_h devh,
    u32 offset,
    macaddr_t macaddr,
    macaddr_t macaddr_mask,
    u64 vpath_vector,
    u32 duplicate_mode)
{
	u32 i;
	u64 data1 = 0ULL;
	u64 data2 = 0ULL;
	__hal_device_t *hldev;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert(devh != NULL);

	hldev = (__hal_device_t *) devh;

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", offset = %d, "
	    "macaddr = %02x-%02x-%02x-%02x-%02x-%02x, "
	    "macaddr_mask = %02x-%02x-%02x-%02x-%02x-%02x, "
	    "vpath_vector = 0x"VXGE_OS_LLXFMT,
	    (ptr_t) devh, offset, macaddr[0], macaddr[1], macaddr[2],
	    macaddr[3], macaddr[4], macaddr[5], macaddr_mask[0],
	    macaddr_mask[1], macaddr_mask[2], macaddr_mask[3],
	    macaddr_mask[4], macaddr_mask[5], vpath_vector);

	for (i = 0; i < VXGE_HAL_ETH_ALEN; i++) {
		data1 <<= 8;
		data1 |= (u8) macaddr[i];
	}

	data1 = VXGE_HAL_RTS_MGR_STEER_DATA0_DA_MAC_ADDR(data1);

	for (i = 0; i < VXGE_HAL_ETH_ALEN; i++) {
		data2 <<= 8;
		data2 |= (u8) macaddr_mask[i];
	}

	switch (duplicate_mode) {
	case VXGE_HAL_VPATH_MAC_ADDR_ADD_DUPLICATE:
		i = 0;
		break;
	case VXGE_HAL_VPATH_MAC_ADDR_DISCARD_DUPLICATE:
		i = 1;
		break;
	case VXGE_HAL_VPATH_MAC_ADDR_REPLACE_DUPLICATE:
		i = 2;
		break;
	default:
		i = 0;
		break;
	}

	data2 = VXGE_HAL_RTS_MGR_STEER_DATA1_DA_MAC_ADDR_MASK(data2) |
	    VXGE_HAL_RTS_MGR_STEER_DATA1_DA_MAC_ADDR_MODE(i);

	status = __hal_mrpcim_rts_table_access(devh,
	    VXGE_HAL_RTS_MGR_STEER_CTRL_WE_WRITE,
	    VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL_DA,
	    offset,
	    &data1,
	    &data2,
	    &vpath_vector);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * vxge_hal_mrpcim_mac_addr_get - Read the mac address entry into
 *				MAC address table.
 * @devh: Device handle.
 * @offset: Index into the DA table to execute the command on.
 * @macaddr: Buffer to return MAC address to be added for this vpath
 *		into the list
 * @macaddr_mask: Buffer to return MAC address mask for macaddr
 * @vpath_vector: Buffer to return Bit mask specifying the vpaths
 *		to which the mac address applies
 *
 * Reads the mac address, mac address mask and vpath vector from
 *		the given offset
 *
 * see also: vxge_hal_mrpcim_mac_addr_add
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_mac_addr_get(
    vxge_hal_device_h devh,
    u32 offset,
    macaddr_t macaddr,
    macaddr_t macaddr_mask,
    u64 *vpath_vector)
{
	u32 i;
	u64 data1 = 0ULL;
	u64 data2 = 0ULL;
	__hal_device_t *hldev;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert(devh != NULL);

	hldev = (__hal_device_t *) devh;

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("hldev = 0x"VXGE_OS_STXFMT,
	    (ptr_t) hldev);

	status = __hal_mrpcim_rts_table_access(devh,
	    VXGE_HAL_RTS_MGR_STEER_CTRL_WE_WRITE,
	    VXGE_HAL_RTS_MGR_STEER_CTRL_DATA_STRUCT_SEL_DA,
	    offset,
	    &data1,
	    &data2,
	    vpath_vector);

	if (status != VXGE_HAL_OK) {

		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	data1 = VXGE_HAL_RTS_MGR_STEER_DATA0_GET_DA_MAC_ADDR(data1);

	data2 = VXGE_HAL_RTS_MGR_STEER_DATA1_GET_DA_MAC_ADDR_MASK(data2);

	for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
		macaddr[i - 1] = (u8) (data1 & 0xFF);
		data1 >>= 8;
	}

	for (i = VXGE_HAL_ETH_ALEN; i > 0; i--) {
		macaddr_mask[i - 1] = (u8) (data2 & 0xFF);
		data2 >>= 8;
	}

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
	    __FILE__, __func__, __LINE__, status);

	return (status);
}

/*
 * vxge_hal_mrpcim_strip_repl_vlan_tag_enable - Enable strip Repl vlan tag.
 * @devh: Device handle.
 *
 * Enable X3100 strip Repl vlan tag.
 * Returns: VXGE_HAL_OK on success.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_strip_repl_vlan_tag_enable(
    vxge_hal_device_h devh)
{
	u64 val64;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	if (hldev->header.config.mrpcim_config.mac_config.
	    rpa_repl_strip_vlan_tag ==
	    VXGE_HAL_MAC_RPA_REPL_STRIP_VLAN_TAG_ENABLE) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
		    __FILE__, __func__, __LINE__);
		return (VXGE_HAL_OK);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg1);

	val64 |= VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_STRIP_VLAN_TAG;

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg1);

	hldev->header.config.mrpcim_config.mac_config.rpa_repl_strip_vlan_tag =
	    VXGE_HAL_MAC_RPA_REPL_STRIP_VLAN_TAG_ENABLE;

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_strip_repl_vlan_tag_disable - Disable strip Repl vlan tag.
 * @devh: Device handle.
 *
 * Disable X3100 strip Repl vlan tag.
 * Returns: VXGE_HAL_OK on success.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_strip_repl_vlan_tag_disable(
    vxge_hal_device_h devh)
{
	u64 val64;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	if (hldev->header.config.mrpcim_config.mac_config.
	    rpa_repl_strip_vlan_tag ==
	    VXGE_HAL_MAC_RPA_REPL_STRIP_VLAN_TAG_DISABLE) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
		    __FILE__, __func__, __LINE__);
		return (VXGE_HAL_OK);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg1);

	val64 &= ~VXGE_HAL_RXMAC_RX_PA_CFG1_REPL_STRIP_VLAN_TAG;

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->rxmac_rx_pa_cfg1);

	hldev->header.config.mrpcim_config.mac_config.rpa_repl_strip_vlan_tag =
	    VXGE_HAL_MAC_RPA_REPL_STRIP_VLAN_TAG_DISABLE;

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_lag_config_get - Get the LAG config.
 * @devh: Device handle.
 * @lconfig: LAG Configuration
 *
 * Returns the current LAG configuration.
 * Returns: VXGE_HAL_OK on success.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_lag_config_get(
    vxge_hal_device_h devh,
    vxge_hal_lag_config_t *lconfig)
{
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", lconfig = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, (ptr_t) lconfig);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	vxge_os_memcpy(lconfig,
	    &hldev->header.config.mrpcim_config.lag_config,
	    sizeof(vxge_hal_lag_config_t));

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_lag_config_set - Set the LAG config.
 * @devh: Device handle.
 * @lconfig: LAG Configuration
 *
 * Sets the LAG configuration.
 * Returns: VXGE_HAL_OK on success.
 *
 */
vxge_hal_status_e
vxge_hal_mrpcim_lag_config_set(
    vxge_hal_device_h devh,
    vxge_hal_lag_config_t *lconfig)
{
	vxge_hal_status_e status;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", lconfig = 0x"VXGE_OS_STXFMT,
	    (ptr_t) devh, (ptr_t) lconfig);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);

		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	status = __hal_device_lag_config_check(lconfig);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	vxge_os_memcpy(&hldev->header.config.mrpcim_config.lag_config,
	    lconfig,
	    sizeof(vxge_hal_lag_config_t));

	status = __hal_mrpcim_lag_configure(hldev);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0",
	    __FILE__, __func__, __LINE__);

	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_getpause_data -Pause frame frame generation and reception.
 * @devh: HAL device handle.
 * @port : Port number 0, 1, or 2
 * @tx : A field to return the pause generation capability of the NIC.
 * @rx : A field to return the pause reception capability of the NIC.
 *
 * Returns the Pause frame generation and reception capability of the NIC.
 * Return value:
 * status
 */
vxge_hal_status_e
vxge_hal_mrpcim_getpause_data(
    vxge_hal_device_h devh,
    u32 port,
    u32 *tx,
    u32 *rx)
{
	u64 val64;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", port = %d, tx = 0x"VXGE_OS_STXFMT", "
	    "rx = 0x"VXGE_OS_STXFMT, (ptr_t) devh, port, (ptr_t) tx,
	    (ptr_t) rx);

	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE);
		return (VXGE_HAL_ERR_INVALID_DEVICE);
	}

	if (port >= VXGE_HAL_MAC_MAX_PORTS) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_PORT);
		return (VXGE_HAL_ERR_INVALID_PORT);
	}

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev, hldev->header.regh0,
	    &hldev->mrpcim_reg->rxmac_pause_cfg_port[port]);

	if (val64 & VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN)
		*tx = 1;

	if (val64 & VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN)
		*rx = 1;


	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: 0",
	    __FILE__, __func__, __LINE__);

	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_setpause_data -  set/reset pause frame generation.
 * @devh: HAL device handle.
 * @port : Port number 0, 1, or 2
 * @tx: A field that indicates the pause generation capability to be
 * set on the NIC.
 * @rx: A field that indicates the pause reception capability to be
 * set on the NIC.
 *
 * It can be used to set or reset Pause frame generation or reception
 * support of the NIC.
 * Return value:
 * int, returns 0 on Success
 */

vxge_hal_status_e
vxge_hal_mrpcim_setpause_data(
    vxge_hal_device_h devh,
    u32 port,
    u32 tx,
    u32 rx)
{
	u64 val64;
	__hal_device_t *hldev = (__hal_device_t *) devh;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim(
	    "devh = 0x"VXGE_OS_STXFMT", port = %d, tx = %d, rx = %d",
	    (ptr_t) devh, port, tx, rx);

	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE);
		return (VXGE_HAL_ERR_INVALID_DEVICE);
	}

	if (port >= VXGE_HAL_MAC_MAX_PORTS) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_PORT);
		return (VXGE_HAL_ERR_INVALID_PORT);
	}

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev, hldev->header.regh0,
	    &hldev->mrpcim_reg->rxmac_pause_cfg_port[port]);
	if (tx)
		val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN;
	else
		val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_GEN_EN;
	if (rx)
		val64 |= VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN;
	else
		val64 &= ~VXGE_HAL_RXMAC_PAUSE_CFG_PORT_RCV_EN;

	vxge_os_pio_mem_write64(hldev->header.pdev, hldev->header.regh0,
	    val64, &hldev->mrpcim_reg->rxmac_pause_cfg_port[port]);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: 0",
	    __FILE__, __func__, __LINE__);
	return (VXGE_HAL_OK);
}

/*
 * vxge_hal_mrpcim_bist_test - invokes the MemBist test of the card .
 * @devh: HAL device handle.
 * vxge_nic structure.
 * @data:variable that returns the result of each of the test conducted by
 * the driver.
 *
 * This invokes the MemBist test of the card. We give around
 * 2 secs time for the Test to complete. If it's still not complete
 * within this peiod, we consider that the test failed.
 * Return value:
 * 0 on success and -1 on failure.
 */
vxge_hal_status_e
vxge_hal_mrpcim_bist_test(vxge_hal_device_h devh, u64 *data)
{
	__hal_device_t *hldev = (__hal_device_t *) devh;
	u8 bist = 0;
	int retry = 0;
	vxge_hal_status_e status = VXGE_HAL_FAIL;

	vxge_assert(devh != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT,
			(ptr_t)devh);

	if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE);
		return (VXGE_HAL_ERR_INVALID_DEVICE);
	}

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	(void) __hal_vpath_pci_read(hldev,
	    hldev->first_vp_id,
	    vxge_offsetof(vxge_hal_pci_config_le_t, bist),
	    1,
	    &bist);
	bist |= 0x40;
	vxge_os_pci_write8(hldev->header.pdev, hldev->header.cfgh,
	    vxge_offsetof(vxge_hal_pci_config_le_t, bist), bist);

	while (retry < 20) {
		(void) __hal_vpath_pci_read(hldev,
		    hldev->first_vp_id,
		    vxge_offsetof(vxge_hal_pci_config_le_t, bist),
		    1,
		    &bist);
		if (!(bist & 0x40)) {
			*data = (bist & 0x0f);
			status = VXGE_HAL_OK;
			break;
		}
		vxge_os_mdelay(100);
		retry++;
	}

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d  Result: %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}

/*
 * __hal_mrpcim_initialize - Initialize mrpcim
 * @hldev: hal device.
 *
 * Initializes mrpcim
 *
 * See also: __hal_mrpcim_terminate()
 */
vxge_hal_status_e
__hal_mrpcim_initialize(__hal_device_t *hldev)
{
	u64 val64;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert(hldev != NULL);

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("hldev = 0x"VXGE_OS_STXFMT,
			(ptr_t)hldev);

	if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__,
		    VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
		return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION);
	}

	hldev->mrpcim = (__hal_mrpcim_t *)
	    vxge_os_malloc(hldev->header.pdev, sizeof(__hal_mrpcim_t));

	if (hldev->mrpcim == NULL) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_OUT_OF_MEMORY);
		return (VXGE_HAL_ERR_OUT_OF_MEMORY);
	}

	vxge_os_memzero(hldev->mrpcim, sizeof(__hal_mrpcim_t));

	__hal_mrpcim_get_vpd_data(hldev);

	hldev->mrpcim->mrpcim_stats_block =
	    __hal_blockpool_block_allocate(hldev, VXGE_OS_HOST_PAGE_SIZE);

	if (hldev->mrpcim->mrpcim_stats_block == NULL) {

		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_OUT_OF_MEMORY);

		return (VXGE_HAL_ERR_OUT_OF_MEMORY);

	}

	hldev->mrpcim->mrpcim_stats = (vxge_hal_mrpcim_stats_hw_info_t *)
	    hldev->mrpcim->mrpcim_stats_block->memblock;

	vxge_os_memzero(hldev->mrpcim->mrpcim_stats,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	vxge_os_memzero(&hldev->mrpcim->mrpcim_stats_sav,
	    sizeof(vxge_hal_mrpcim_stats_hw_info_t));

	status = __hal_mrpcim_mac_configure(hldev);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	status = __hal_mrpcim_lag_configure(hldev);

	if (status != VXGE_HAL_OK) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mdio_gen_cfg_port[0]);

	hldev->mrpcim->mdio_phy_prtad0 =
	    (u32) VXGE_HAL_MDIO_GEN_CFG_PORT_GET_MDIO_PHY_PRTAD(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mdio_gen_cfg_port[1]);

	hldev->mrpcim->mdio_phy_prtad1 =
	    (u32) VXGE_HAL_MDIO_GEN_CFG_PORT_GET_MDIO_PHY_PRTAD(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->xgxs_static_cfg_port[0]);

	hldev->mrpcim->mdio_dte_prtad0 =
	    (u32) VXGE_HAL_XGXS_STATIC_CFG_PORT_GET_MDIO_DTE_PRTAD(val64);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->xgxs_static_cfg_port[1]);

	hldev->mrpcim->mdio_dte_prtad1 =
	    (u32) VXGE_HAL_XGXS_STATIC_CFG_PORT_GET_MDIO_DTE_PRTAD(val64);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    hldev->mrpcim->mrpcim_stats_block->dma_addr,
	    &hldev->mrpcim_reg->mrpcim_stats_start_host_addr);

	val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
	    hldev->header.regh0,
	    &hldev->mrpcim_reg->mrpcim_general_cfg2);

	val64 &= ~VXGE_HAL_MRPCIM_GENERAL_CFG2_MRPCIM_STATS_MAP_TO_VPATH(0x1f);
	val64 |= VXGE_HAL_MRPCIM_GENERAL_CFG2_MRPCIM_STATS_MAP_TO_VPATH(
	    hldev->first_vp_id);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    val64,
	    &hldev->mrpcim_reg->mrpcim_general_cfg2);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    vBIT(0xFFFFFFFFFFFFFFFFULL, 0, VXGE_HAL_MAX_VIRTUAL_PATHS),
	    &hldev->mrpcim_reg->rxmac_authorize_all_addr);

	vxge_os_pio_mem_write64(hldev->header.pdev,
	    hldev->header.regh0,
	    vBIT(0xFFFFFFFFFFFFFFFFULL, 0, VXGE_HAL_MAX_VIRTUAL_PATHS),
	    &hldev->mrpcim_reg->rxmac_authorize_all_vid);

	if (hldev->header.config.intr_mode ==
	    VXGE_HAL_INTR_MODE_EMULATED_INTA) {

		val64 = vxge_os_pio_mem_read64(hldev->header.pdev,
		    hldev->header.regh0,
		    &hldev->mrpcim_reg->rdcrdtarb_cfg0);

		/* Set MOST to 8 for HP-ISS platform */
		val64 &= ~VXGE_HAL_RDCRDTARB_CFG0_MAX_OUTSTANDING_RDS(0x3f);

		val64 |= VXGE_HAL_RDCRDTARB_CFG0_MAX_OUTSTANDING_RDS(8);

		vxge_os_pio_mem_write64(hldev->header.pdev,
		    hldev->header.regh0,
		    val64,
		    &hldev->mrpcim_reg->rdcrdtarb_cfg0);
	}

	(void) __hal_ifmsg_wmsg_post(hldev,
	    hldev->first_vp_id,
	    VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
	    VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_PRIV_DRIVER_UP,
	    0);

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);

}

/*
 * __hal_mrpcim_terminate - Terminates mrpcim
 * @hldev: hal device.
 *
 * Terminates mrpcim.
 *
 * See also: __hal_mrpcim_initialize()
 */
vxge_hal_status_e
__hal_mrpcim_terminate(__hal_device_t *hldev)
{
	vxge_hal_device_h devh = (vxge_hal_device_h) hldev;
	vxge_hal_status_e status = VXGE_HAL_OK;

	vxge_assert((hldev != NULL) && (hldev->mrpcim != NULL));

	vxge_hal_trace_log_mrpcim("==> %s:%s:%d",
	    __FILE__, __func__, __LINE__);

	vxge_hal_trace_log_mrpcim("hldev = 0x"VXGE_OS_STXFMT,
	    (ptr_t) hldev);

	if (hldev->mrpcim == NULL) {
		vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
		    __FILE__, __func__, __LINE__, status);
		return (status);
	}

	(void) __hal_ifmsg_wmsg_post(hldev,
	    hldev->first_vp_id,
	    VXGE_HAL_RTS_ACCESS_STEER_MSG_DEST_BROADCAST,
	    VXGE_HAL_RTS_ACCESS_STEER_DATA0_MSG_TYPE_PRIV_DRIVER_DOWN,
	    0);

	if (hldev->mrpcim->mrpcim_stats_block != NULL) {
		__hal_blockpool_block_free(devh,
		    hldev->mrpcim->mrpcim_stats_block);
		hldev->mrpcim->mrpcim_stats_block = NULL;
	}

	vxge_os_free(hldev->header.pdev,
	    hldev->mrpcim, sizeof(__hal_mrpcim_t));

	hldev->mrpcim = NULL;

	vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = %d",
	    __FILE__, __func__, __LINE__, status);
	return (status);
}
