/*
<:copyright-BRCM:2016:DUAL/GPL:standard

   Broadcom Proprietary and Confidential.(c) 2016 Broadcom
   All Rights Reserved

Unless you and Broadcom execute a separate written software license
agreement governing use of this software, this software is licensed
to you under the terms of the GNU General Public License version 2
(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
with the following added to such license:

   As a special exception, the copyright holders of this software give
   you permission to link this software with independent modules, and
   to copy and distribute the resulting executable under terms of your
   choice, provided that you also meet, for each linked independent
   module, the terms and conditions of the license of that module.
   An independent module is a module which is not derived from this
   software.  The special exception does not apply to any modifications
   of the software.

Not withstanding the above, under no circumstances may you combine
this software in any way with any other Broadcom software provided
under a license other than the GPL, without Broadcom's express prior
written consent.

:>
 */
 
#include <bcmos_system.h>
#if !defined(LINUX_USER_SPACE)
#include <bcmolt_dev_ctrl.h>
#else
bcmos_errno bcmolt_dev_ctrl_init(void);
#endif
#include <bcm_dev_log.h>
#include "bcmolt_host_api.h"

bcmos_errno bcmolt_host_init(bcmolt_host_init_params *params)
{
    bcmos_errno rc;

    rc = bcmos_init();
    BUG_ON(rc);

#ifdef ENABLE_LOG
    if (params->logger_init_cb)
    {
        rc = params->logger_init_cb();
        BUG_ON(rc);
    }
#endif

    bcmos_trace_level_set(BCMOS_TRACE_LEVEL_ERROR);

    /* In usermode Linux, we don't invoke bcmolt_dev_ctrl_init() from the application, but from a kernel module (bcm_dev_ctrl_linux.ko). */
#if !defined(LINUX_USER_SPACE)
    rc = bcmolt_dev_ctrl_init(&params->dev_ctrl_params);
    BUG_ON(rc);
#else
    if (params->run_dev_ctrl)
    {
        rc = bcmolt_dev_ctrl_init();
        BUG_ON(rc);
    }
#endif

#if !defined(__KERNEL__)
    /* Initialize transport layer. */
    rc = bcmtr_init();
    BUG_ON(rc);
#endif

    return BCM_ERR_OK;
}

