a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER START
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The contents of this file are subject to the terms of the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Common Development and Distribution License (the "License").
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You may not use this file except in compliance with the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a23fd118e437af0a7877dd313db8fdaa3537c675yl * or http://www.opensolaris.org/os/licensing.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See the License for the specific language governing permissions
a23fd118e437af0a7877dd313db8fdaa3537c675yl * and limitations under the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * When distributing Covered Code, include this CDDL HEADER in each
a23fd118e437af0a7877dd313db8fdaa3537c675yl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * If applicable, add the following below this CDDL HEADER, with the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * fields enclosed by brackets "[]" replaced with your own identifying
a23fd118e437af0a7877dd313db8fdaa3537c675yl * information: Portions Copyright [yyyy] [name of copyright owner]
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER END
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl * Copyright (c) 2002-2006 Neterion, Inc.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-driver.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-device.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic xge_hal_driver_t g_driver;
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_driver_t *g_xge_hal_driver = NULL;
a23fd118e437af0a7877dd313db8fdaa3537c675ylchar *g_xge_hal_log = NULL;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_OS_MEMORY_CHECK
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_os_malloc_t g_malloc_arr[XGE_OS_MALLOC_CNT_MAX];
a23fd118e437af0a7877dd313db8fdaa3537c675ylint g_malloc_cnt = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Runtime tracing support
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
7eced415e5dd557aef2d78483b5a7785f0e13670xwstatic unsigned long g_module_mask_default = 0;
7eced415e5dd557aef2d78483b5a7785f0e13670xwunsigned long *g_module_mask = &g_module_mask_default;
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic int g_level_default = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675ylint *g_level = &g_level_default;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_TRACE_INTO_CIRCULAR_ARR
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic xge_os_tracebuf_t g_tracebuf;
a23fd118e437af0a7877dd313db8fdaa3537c675ylchar *dmesg, *dmesg_start;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_driver_tracebuf_dump - Dump the trace buffer.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Dump the trace buffer contents.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_driver_tracebuf_dump(void)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl int i;
7eced415e5dd557aef2d78483b5a7785f0e13670xw int off = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (g_xge_os_tracebuf == NULL) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl return;
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("################ Trace dump Begin ###############");
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (g_xge_os_tracebuf->wrapped_once) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl for (i = 0; i < g_xge_os_tracebuf->size -
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_xge_os_tracebuf->offset; i += off) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (*(dmesg_start + i))
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf(dmesg_start + i);
a23fd118e437af0a7877dd313db8fdaa3537c675yl off = xge_os_strlen(dmesg_start + i) + 1;
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl for (i = 0; i < g_xge_os_tracebuf->offset; i += off) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (*(dmesg + i))
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf(dmesg + i);
a23fd118e437af0a7877dd313db8fdaa3537c675yl off = xge_os_strlen(dmesg + i) + 1;
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("################ Trace dump End ###############");
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
7eced415e5dd557aef2d78483b5a7785f0e13670xw
7eced415e5dd557aef2d78483b5a7785f0e13670xwxge_hal_status_e
7eced415e5dd557aef2d78483b5a7785f0e13670xwxge_hal_driver_tracebuf_read(int bufsize, char *retbuf, int *retsize)
7eced415e5dd557aef2d78483b5a7785f0e13670xw{
7eced415e5dd557aef2d78483b5a7785f0e13670xw int i;
7eced415e5dd557aef2d78483b5a7785f0e13670xw int off = 0, retbuf_off = 0;
7eced415e5dd557aef2d78483b5a7785f0e13670xw
7eced415e5dd557aef2d78483b5a7785f0e13670xw *retsize = 0;
7eced415e5dd557aef2d78483b5a7785f0e13670xw *retbuf = 0;
7eced415e5dd557aef2d78483b5a7785f0e13670xw
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (g_xge_os_tracebuf == NULL) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw return XGE_HAL_FAIL;
7eced415e5dd557aef2d78483b5a7785f0e13670xw }
7eced415e5dd557aef2d78483b5a7785f0e13670xw
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (g_xge_os_tracebuf->wrapped_once) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw for (i = 0; i < g_xge_os_tracebuf->size -
7eced415e5dd557aef2d78483b5a7785f0e13670xw g_xge_os_tracebuf->offset; i += off) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (*(dmesg_start + i)) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw xge_os_snprintf((retbuf + retbuf_off), (bufsize - retbuf_off),
7eced415e5dd557aef2d78483b5a7785f0e13670xw "%s\n", dmesg_start + i);
7eced415e5dd557aef2d78483b5a7785f0e13670xw retbuf_off += xge_os_strlen(dmesg_start + i) + 1;
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (retbuf_off > bufsize)
7eced415e5dd557aef2d78483b5a7785f0e13670xw return XGE_HAL_ERR_OUT_OF_MEMORY;
7eced415e5dd557aef2d78483b5a7785f0e13670xw }
7eced415e5dd557aef2d78483b5a7785f0e13670xw off = xge_os_strlen(dmesg_start + i) + 1;
7eced415e5dd557aef2d78483b5a7785f0e13670xw }
7eced415e5dd557aef2d78483b5a7785f0e13670xw }
7eced415e5dd557aef2d78483b5a7785f0e13670xw for (i = 0; i < g_xge_os_tracebuf->offset; i += off) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (*(dmesg + i)) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw xge_os_snprintf((retbuf + retbuf_off), (bufsize - retbuf_off),
7eced415e5dd557aef2d78483b5a7785f0e13670xw "%s\n", dmesg + i);
7eced415e5dd557aef2d78483b5a7785f0e13670xw retbuf_off += xge_os_strlen(dmesg + i) + 1;
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (retbuf_off > bufsize)
7eced415e5dd557aef2d78483b5a7785f0e13670xw return XGE_HAL_ERR_OUT_OF_MEMORY;
7eced415e5dd557aef2d78483b5a7785f0e13670xw }
7eced415e5dd557aef2d78483b5a7785f0e13670xw off = xge_os_strlen(dmesg + i) + 1;
7eced415e5dd557aef2d78483b5a7785f0e13670xw }
7eced415e5dd557aef2d78483b5a7785f0e13670xw
7eced415e5dd557aef2d78483b5a7785f0e13670xw *retsize = retbuf_off;
7eced415e5dd557aef2d78483b5a7785f0e13670xw *(retbuf + retbuf_off + 1) = 0;
7eced415e5dd557aef2d78483b5a7785f0e13670xw
7eced415e5dd557aef2d78483b5a7785f0e13670xw return XGE_HAL_OK;
7eced415e5dd557aef2d78483b5a7785f0e13670xw}
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_os_tracebuf_t *g_xge_os_tracebuf = NULL;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_HAL_DEBUG_BAR0_OFFSET
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_driver_bar0_offset_check(void)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, adapter_status) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x108);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, tx_traffic_int) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x08E0);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, dtx_control) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x09E8);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, tx_fifo_partition_0) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x1108);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, pcc_enable) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x1170);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, prc_rxd0_n[0]) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x1930);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, rti_command_mem) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x19B8);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, mac_cfg) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x2100);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, rmac_addr_cmd_mem) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x2128);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, mac_link_util) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x2170);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, mc_pause_thresh_q0q3) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x2918);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, pcc_err_reg) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x1040);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, rxdma_int_status) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x1800);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, mac_tmac_err_reg) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x2010);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, mc_err_reg) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x2810);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(xge_offsetof(xge_hal_pci_bar0_t, xgxs_int_status) ==
a23fd118e437af0a7877dd313db8fdaa3537c675yl 0x3000);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_driver_initialize - Initialize HAL.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @config: HAL configuration, see xge_hal_driver_config_t{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @uld_callbacks: Upper-layer driver callbacks, e.g. link-up.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * HAL initialization entry point. Not to confuse with device initialization
a23fd118e437af0a7877dd313db8fdaa3537c675yl * (note that HAL "contains" zero or more Xframe devices).
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Returns: XGE_HAL_OK - success;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * XGE_HAL_ERR_BAD_DRIVER_CONFIG - Driver configuration params invalid.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_device_initialize(), xge_hal_status_e{},
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_uld_cbs_t{}.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_status_e
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_driver_initialize(xge_hal_driver_config_t *config,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_uld_cbs_t *uld_callbacks)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_status_e status;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_xge_hal_driver = &g_driver;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_driver_debug_module_mask_set(XGE_DEBUG_MODULE_MASK_DEF);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_driver_debug_level_set(XGE_DEBUG_LEVEL_DEF);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_HAL_DEBUG_BAR0_OFFSET
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_driver_bar0_offset_check();
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_TRACE_INTO_CIRCULAR_ARR
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (config->tracebuf_size == 0)
7eced415e5dd557aef2d78483b5a7785f0e13670xw /*
7eced415e5dd557aef2d78483b5a7785f0e13670xw * Trace buffer implementation is not lock protected.
7eced415e5dd557aef2d78483b5a7785f0e13670xw * The only harm to expect is memcpy() to go beyond of
7eced415e5dd557aef2d78483b5a7785f0e13670xw * allowed boundaries. To make it safe (driver-wise),
7eced415e5dd557aef2d78483b5a7785f0e13670xw * we pre-allocate needed number of extra bytes.
7eced415e5dd557aef2d78483b5a7785f0e13670xw */
7eced415e5dd557aef2d78483b5a7785f0e13670xw config->tracebuf_size = XGE_HAL_DEF_CIRCULAR_ARR +
7eced415e5dd557aef2d78483b5a7785f0e13670xw XGE_OS_TRACE_MSGBUF_MAX;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl status = __hal_driver_config_check(config);
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (status != XGE_HAL_OK)
a23fd118e437af0a7877dd313db8fdaa3537c675yl return status;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_memzero(g_xge_hal_driver, sizeof(xge_hal_driver_t));
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* apply config */
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_memcpy(&g_xge_hal_driver->config, config,
a23fd118e437af0a7877dd313db8fdaa3537c675yl sizeof(xge_hal_driver_config_t));
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* apply ULD callbacks */
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_memcpy(&g_xge_hal_driver->uld_callbacks, uld_callbacks,
a23fd118e437af0a7877dd313db8fdaa3537c675yl sizeof(xge_hal_uld_cbs_t));
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_xge_hal_driver->is_initialized = 1;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_TRACE_INTO_CIRCULAR_ARR
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_tracebuf.size = config->tracebuf_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_tracebuf.data = (char *)xge_os_malloc(NULL, g_tracebuf.size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (g_tracebuf.data == NULL) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("cannot allocate trace buffer!");
a23fd118e437af0a7877dd313db8fdaa3537c675yl return XGE_HAL_ERR_OUT_OF_MEMORY;
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
7eced415e5dd557aef2d78483b5a7785f0e13670xw /* timestamps disabled by default */
7eced415e5dd557aef2d78483b5a7785f0e13670xw g_tracebuf.timestamp = config->tracebuf_timestamp_en;
7eced415e5dd557aef2d78483b5a7785f0e13670xw if (g_tracebuf.timestamp) {
7eced415e5dd557aef2d78483b5a7785f0e13670xw xge_os_timestamp(g_tracebuf.msg);
7eced415e5dd557aef2d78483b5a7785f0e13670xw g_tracebuf.msgbuf_max = XGE_OS_TRACE_MSGBUF_MAX -
7eced415e5dd557aef2d78483b5a7785f0e13670xw xge_os_strlen(g_tracebuf.msg);
7eced415e5dd557aef2d78483b5a7785f0e13670xw } else
7eced415e5dd557aef2d78483b5a7785f0e13670xw g_tracebuf.msgbuf_max = XGE_OS_TRACE_MSGBUF_MAX;
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_tracebuf.offset = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl *g_tracebuf.msg = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_memzero(g_tracebuf.data, g_tracebuf.size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_xge_os_tracebuf = &g_tracebuf;
a23fd118e437af0a7877dd313db8fdaa3537c675yl dmesg = g_tracebuf.data;
a23fd118e437af0a7877dd313db8fdaa3537c675yl *dmesg = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl return XGE_HAL_OK;
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/**
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_driver_terminate - Terminate HAL.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * HAL termination entry point.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See also: xge_hal_device_terminate().
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_driver_terminate(void)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_xge_hal_driver->is_initialized = 0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_TRACE_INTO_CIRCULAR_ARR
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (g_tracebuf.size) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_free(NULL, g_tracebuf.data, g_tracebuf.size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_xge_hal_driver = NULL;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef XGE_OS_MEMORY_CHECK
a23fd118e437af0a7877dd313db8fdaa3537c675yl {
a23fd118e437af0a7877dd313db8fdaa3537c675yl int i, leaks=0;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("OSPAL: max g_malloc_cnt %d", g_malloc_cnt);
a23fd118e437af0a7877dd313db8fdaa3537c675yl for (i=0; i<g_malloc_cnt; i++) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (g_malloc_arr[i].ptr != NULL) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("OSPAL: memory leak detected at "
8347601bcb0a439f6e50fc36b4039a73d08700e1yl "%s:%d:"XGE_OS_LLXFMT":%d",
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_malloc_arr[i].file,
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_malloc_arr[i].line,
a23fd118e437af0a7877dd313db8fdaa3537c675yl (unsigned long long)(ulong_t)
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_malloc_arr[i].ptr,
a23fd118e437af0a7877dd313db8fdaa3537c675yl g_malloc_arr[i].size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl leaks++;
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (leaks) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("OSPAL: %d memory leaks detected", leaks);
a23fd118e437af0a7877dd313db8fdaa3537c675yl } else {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_printf("OSPAL: no memory leaks detected");
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl}