#include <bcmolt_tr_ud_driver.h>
#include <bcm_dev_log.h>
#include <bcmolt_dev_ctrl.h>
#include <bcmolt_tr_mux.h>
#include <bcmos_system.h>
#include <bcmolt_user_utils.h>
#include <bcmolt_host_api.h>
#include <bcmolt_fld.h>
#include <bcmtr_pcie.h>

extern struct proc_dir_entry *bcmolt_dir;

bcmos_errno bcmtr_init(void)
{
    return BCM_ERR_OK;
}

#ifdef ENABLE_LOG
#define DEV_LOG_SIZE1 1<<11
#define DEV_LOG_SIZE2 1<<13
#define DEV_LOG_QUEUE_SIZE 1000

static bcmos_errno dev_ctrl_logger_init_cb(void)
{
    bcmos_errno rc;
    static uint8_t logger_buf1[DEV_LOG_SIZE1];
    static uint8_t logger_buf2[DEV_LOG_SIZE2];
    void *addresses[DEV_LOG_MAX_FILES] = {logger_buf1, logger_buf2};
    uint32_t sizes[DEV_LOG_MAX_FILES] = {sizeof(logger_buf1), sizeof(logger_buf2)};
    uint32_t flags[DEV_LOG_MAX_FILES] = {BCM_DEV_LOG_FILE_FLAG_STOP_WHEN_FULL, BCM_DEV_LOG_FILE_FLAG_WRAP_AROUND};

    rc = bcm_dev_log_init_default_logger(addresses, sizes, flags, BCM_SIZEOFARRAY(addresses), 0x4000, TASK_PRIORITY_DEV_LOG, DEV_LOG_QUEUE_SIZE);
    BCMOS_TRACE_CHECK_RETURN(rc, rc, "bcm_dev_log_initialize_dev_logger_default()\n");

    /* For now just map BCMOS_TRACE_XX to dev_log. Later on dev_control
     * can define its own log ids
     */
    //rc = bcm_dev_log_os_trace_init();
    //BUG_ON(rc);

    return rc;
}
#endif



int main(int argc, char *argv[])
{
    bcmos_errno rc;
    bcmolt_host_init_params params =
    {
#ifdef ENABLE_LOG
        .logger_init_cb = dev_ctrl_logger_init_cb,
#endif
        .run_dev_ctrl = BCMOS_TRUE
    };

    rc = bcmolt_host_init(&params);
    BUG_ON(rc);

    bcmos_trace_level_set(BCMOS_TRACE_LEVEL_DEBUG);

    rc = bcmtr_ud_init();  /*  Never returns - runs accept loop */
    BUG_ON(rc);

    while (BCMOS_TRUE)
    {
        bcmos_usleep(5*1000*1000);
        bcmos_printf("Waiting\n");
    }
}

