blob: cdffb5927ab0e330e41ad1bba9c4cc76c5c1b38a [file] [log] [blame]
/*
<: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>
#include <bcm_dev_log.h>
#include <bcm_dev_log_task_internal.h>
/* We don't support dev_log CLI in linux kernel space */
#ifndef __KERNEL__
/* Dev log CLI session supports receiving long lines - we shall simply split them into shorter log messages. */
#define DEV_LOG_CLI_SESSION_MAX_MSG_SIZE (MAX_DEV_LOG_STRING_NET_SIZE * 10)
enum
{
ID_BY_INDEX,
ID_BY_NAME,
};
static bcmos_errno bcm_dev_log_file_print(uint32_t file_index, int32_t xi_msgs_num, bcm_dev_log_print_cb xi_print_callback, void *arg, bcmos_bool clear)
{
bcm_dev_log_file *file;
char log_string[MAX_DEV_LOG_STRING_SIZE];
int length;
uint32_t num_msgs;
uint32_t i;
uint32_t offset = 0;
bcmos_errno err = BCM_ERR_OK;
file = bcm_dev_log_file_get(file_index);
if (!file)
return BCM_ERR_PARM;
num_msgs = bcm_dev_log_get_num_of_messages(file);
if (xi_msgs_num && xi_msgs_num < num_msgs)
num_msgs = xi_msgs_num;
DEV_LOG_INFO_PRINTF("file=%p, print %d msgs from file (orig: %d)\n", (void *)file, (int)num_msgs, (int)xi_msgs_num);
/* Print file */
for (i = 0; (i < xi_msgs_num) || !xi_msgs_num; i++)
{
/* Read from file */
length = bcm_dev_log_file_read(file, &offset, log_string, sizeof(log_string));
if (!length)
break;
xi_print_callback(arg, log_string);
}
if (clear == BCMOS_TRUE)
err = bcm_dev_log_file_clear(file);
return err;
}
static const char *dev_log_str_style(bcm_dev_log_style style)
{
static const char *strings[] =
{
[BCM_DEV_LOG_STYLE_NORMAL] = "NORMAL",
[BCM_DEV_LOG_STYLE_BOLD] = "BOLD",
[BCM_DEV_LOG_STYLE_UNDERLINE] = "UNDERLINE",
[BCM_DEV_LOG_STYLE_BLINK] = "BLINK",
[BCM_DEV_LOG_STYLE_REVERSE_VIDEO] = "REVERSE_VIDEO",
};
return strings[style > BCM_DEV_LOG_STYLE_REVERSE_VIDEO ? BCM_DEV_LOG_STYLE_REVERSE_VIDEO : style];
}
#ifdef TRIGGER_LOGGER_FEATURE
static void bcm_dev_log_cli_session_print_features(bcmcli_session *session, const char *tabs, const dev_log_id_parm *id_parm)
{
bcmcli_session_print(session,
"%sthrottle : level = %c, threshold = %-5u\n",
tabs,
log_level_str[id_parm->throttle_log_level],
id_parm->throttle.threshold);
bcmcli_session_print(session,
"%strigger : level = %c, start = %-5u, stop = %-5u, repeat = %-5u\n",
tabs,
log_level_str[id_parm->trigger_log_level],
id_parm->trigger.start_threshold,
id_parm->trigger.stop_threshold,
id_parm->trigger.repeat_threshold);
}
#endif
static void bcm_dev_log_cli_session_print_id_parm(bcmcli_session *session, const char *tabs, const dev_log_id_parm *id_parm)
{
bcmcli_session_print(session,
"name=%16s, log_type=%u, default_log_type=%u, log_level_print=%c (%u), log_level_save=%c (%u), default_log_level=%c (%u), style=%s (%u), lost_msg_cnt=%u, print_skipped_count=%u\n",
id_parm->name,
id_parm->log_type,
id_parm->default_log_type,
log_level_str[id_parm->log_level_print],
id_parm->log_level_print,
log_level_str[id_parm->log_level_save],
id_parm->log_level_save,
log_level_str[id_parm->default_log_level],
id_parm->default_log_level,
dev_log_str_style(id_parm->style),
id_parm->style,
id_parm->lost_msg_cnt,
id_parm->print_skipped_count);
bcmcli_session_print(session,
"%scounters = {%c %-5u,%c %-5u,%c %-5u,%c %-5u,%c %-5u,%c %-5u}\n",
tabs,
log_level_str[DEV_LOG_LEVEL_NO_LOG],
id_parm->counters[DEV_LOG_LEVEL_NO_LOG],
log_level_str[DEV_LOG_LEVEL_FATAL],
id_parm->counters[DEV_LOG_LEVEL_FATAL],
log_level_str[DEV_LOG_LEVEL_ERROR],
id_parm->counters[DEV_LOG_LEVEL_ERROR],
log_level_str[DEV_LOG_LEVEL_WARNING],
id_parm->counters[DEV_LOG_LEVEL_WARNING],
log_level_str[DEV_LOG_LEVEL_INFO],
id_parm->counters[DEV_LOG_LEVEL_INFO],
log_level_str[DEV_LOG_LEVEL_DEBUG],
id_parm->counters[DEV_LOG_LEVEL_DEBUG]);
#ifdef TRIGGER_LOGGER_FEATURE
bcm_dev_log_cli_session_print_features(session, tabs, id_parm);
#endif
}
static bcmos_errno bcm_dev_log_cli_print_dev_log(
bcmcli_session *session,
const bcmcli_cmd_parm parm[],
uint16_t n_parms)
{
uint32_t i;
bcm_dev_log_file *file;
for (i = 0; i < DEV_LOG_MAX_FILES; i++)
{
file = bcm_dev_log_file_get(i);
if (!file)
continue;
bcmcli_session_print(session, TAB "file[%u]:\n", i);
bcmcli_session_print(session, TAB2 "max_msgs = %u\n", bcm_dev_log_get_num_of_messages(file));
bcmcli_session_print(session, TAB2 "file_parm:\n");
bcmcli_session_print(session, TAB3 "start_addr = %p\n", dev_log.files[i].file_parm.start_addr);
bcmcli_session_print(session, TAB3 "size = %u\n", dev_log.files[i].file_parm.size);
bcmcli_session_print(session, TAB3 "read_cb = %p\n", (void *)dev_log.files[i].file_parm.read_cb);
bcmcli_session_print(session, TAB3 "write_cb = %p\n", (void *)dev_log.files[i].file_parm.write_cb);
bcmcli_session_print(session, TAB3 "flags = %x\n", dev_log.files[i].file_parm.flags);
}
bcmcli_session_print(session, TAB "state = %u\n", dev_log.state);
bcmcli_session_print(session, TAB "msg_count = %u\n", dev_log.msg_count);
bcmcli_session_print(session, TAB "save_queue:\n");
bcmcli_session_print(session, TAB2 "is_waiting = %u\n", dev_log.save_queue.is_waiting);
bcmcli_session_print(session, TAB "print_queue:\n");
bcmcli_session_print(session, TAB2 "is_waiting = %u\n", dev_log.print_queue.is_waiting);
bcmcli_session_print(session, TAB "save_task:\n");
bcmcli_session_print(session, TAB2 "active_modules = %u\n", dev_log.save_task.active_modules);
bcmcli_session_print(session, TAB2 "current_module = %u\n", dev_log.save_task.current_module);
bcmcli_session_print(session, TAB "print_task:\n");
bcmcli_session_print(session, TAB2 "active_modules = %u\n", dev_log.print_task.active_modules);
bcmcli_session_print(session, TAB2 "current_module = %u\n", dev_log.print_task.current_module);
bcmcli_session_print(session, TAB "num_ids = %u\n", dev_log.num_ids);
bcmcli_session_print(session, TAB "ids[]:\n");
for (i = 0; i < dev_log.num_ids; i++)
{
bcmcli_session_print(session, TAB2 "ids[%2u]: ", i);
bcm_dev_log_cli_session_print_id_parm(session, TAB3, &dev_log.ids[i]);
}
for (i = 0; i < log_name_table_index; i++)
{
if (logs_names[i].first_instance == LOG_NAME_NO_INSTANCE)
{
bcmcli_session_print(session, TAB2 "%s\n", logs_names[i].name);
}
else
{
bcmcli_session_print(session, TAB2 "%s %d - %d\n", logs_names[i].name, logs_names[i].first_instance, logs_names[i].last_instance);
}
}
return BCM_ERR_OK;
}
static bcmos_errno bcm_dev_log_cli_logger_control(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcm_dev_log_set_control(parm[0].value.unumber != 0);
return BCM_ERR_OK;
}
static bcmos_errno bcm_dev_log_cli_file_print(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
return bcm_dev_log_file_print(
parm[0].value.unumber,
0,
(bcm_dev_log_print_cb)bcmcli_session_print,
session,
(bcmos_bool)parm[1].value.unumber);
}
static bcmos_errno bcm_dev_log_cli_file_clear(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
bcm_dev_log_file *file = bcm_dev_log_file_get(parm[0].value.unumber);
if (!file)
return BCM_ERR_PARM;
return bcm_dev_log_file_clear(file);
}
static bcmos_errno bcm_dev_log_cli_file_set_flags(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log.files[parm[0].value.unumber].file_parm.flags |= (bcm_dev_log_file_flags)parm[1].value.unumber;
return BCM_ERR_OK;
}
static bcmos_errno bcm_dev_log_cli_file_reset_flags(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log.files[parm[0].value.unumber].file_parm.flags = 0;
return BCM_ERR_OK;
}
static bcmos_errno bcm_dev_log_cli_id_get(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
dev_log_id_parm id_parm;
bcmos_errno err;
id = parm[0].value.unumber == ID_BY_INDEX ? bcm_dev_log_id_get_by_index(parm[1].value.unumber) :
bcm_dev_log_id_get_by_name(parm[1].value.string);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
err = bcm_dev_log_id_get(id, &id_parm);
if (err)
{
bcmcli_session_print(session, "Error: can get id (err: %d)\n", err);
return err;
}
bcm_dev_log_cli_session_print_id_parm(session, TAB, &id_parm);
return BCM_ERR_OK;
}
static bcmos_errno bcm_dev_log_cli_id_set_type(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
return bcm_dev_log_id_set_type(id, (bcm_dev_log_id_type)parm[1].value.unumber);
}
static bcmos_errno bcm_dev_log_cli_id_set_level(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
return bcm_dev_log_id_set_level(
id,
(bcm_dev_log_level)parm[1].value.unumber,
(bcm_dev_log_level)parm[2].value.unumber);
}
static bcmos_errno bcm_dev_log_cli_name_set_level(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
id = bcm_dev_log_id_get_by_name(parm[0].value.string);
if (id == DEV_LOG_INVALID_ID)
{
return BCM_ERR_NOENT;
}
return bcm_dev_log_id_set_level(
id,
(bcm_dev_log_level)parm[1].value.unumber,
(bcm_dev_log_level)parm[2].value.unumber);
}
static bcmos_errno bcm_dev_log_cli_id_set_to_default(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
return bcm_dev_log_id_set_levels_and_type_to_default(id);
}
static bcmos_errno bcm_dev_log_cli_id_set_style(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
bcm_dev_log_style style;
id = bcm_dev_log_id_get_by_index(bcmcli_find_named_parm(session, "index")->value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
style = (bcm_dev_log_style)bcmcli_find_named_parm(session, "style")->value.unumber;
return bcm_dev_log_id_set_style(id, style);
}
static bcmos_errno bcm_dev_log_cli_id_clear_counters(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
return bcm_dev_log_id_clear_counters(id);
}
static bcmos_errno bcm_dev_log_cli_log(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
bcm_dev_log_level log_level;
uint32_t count = 1;
const char *string;
bcmcli_cmd_parm *cmd_parm;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
if ((cmd_parm = bcmcli_find_named_parm(session, "count")))
{
count = cmd_parm->value.unumber;
if (!count)
{
count = 1;
}
}
log_level = (bcm_dev_log_level)parm[1].value.unumber;
string = parm[2].value.string;
while (count--)
{
bcm_dev_log_log(id, log_level, BCM_LOG_FLAG_NONE, "%5u| Message: %s\n", count, string);
}
return BCM_ERR_OK;
}
static bcmos_errno bcm_dev_log_cli_instance_enable(
bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
static char log_name[MAX_DEV_LOG_ID_NAME];
bcmos_bool enable = (bcmos_bool)bcmcli_find_named_parm(session, "enable")->value.unumber;
uint32_t inst = bcmcli_find_named_parm(session, "instance")->value.unumber;
dev_log_id log_id;
bcmos_errno err;
uint32_t i;
for (i = 0; i < log_name_table_index; i++)
{
if (logs_names[i].first_instance != LOG_NAME_NO_INSTANCE &&
inst >= logs_names[i].first_instance &&
inst <= logs_names[i].last_instance)
{
snprintf(log_name, sizeof(log_name), "%s%u", logs_names[i].name, inst);
log_id = bcm_dev_log_id_get_by_name(log_name);
if (log_id == DEV_LOG_INVALID_ID)
{
bcmcli_session_print(session, "Error: log ID not found: %s\n", log_name);
return BCM_ERR_INTERNAL;
}
err = bcm_dev_log_id_set_type(log_id, enable ? DEV_LOG_ID_TYPE_BOTH : DEV_LOG_ID_TYPE_NONE);
if (err != BCM_ERR_OK)
{
bcmcli_session_print(session, "Error setting log type: %s\n", bcmos_strerror(err));
return err;
}
bcmcli_session_print(session, "Log '%s' %s\n", log_name, enable ? "enabled" : "disabled");
}
}
return BCM_ERR_OK;
}
#ifdef TRIGGER_LOGGER_FEATURE
static bcmos_errno bcm_dev_log_cli_throttle(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
return bcm_dev_log_set_throttle(id, parm[1].value.unumber, parm[2].value.unumber);
}
static bcmos_errno bcm_dev_log_cli_trigger(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
int32_t repeat = 0;
bcmcli_cmd_parm *cmd_parm;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
if ((cmd_parm = bcmcli_find_named_parm(session, "repeat")))
repeat = cmd_parm->value.number;
return bcm_dev_log_set_trigger(id, parm[1].value.unumber, parm[2].value.unumber, parm[3].value.unumber, repeat);
}
static bcmos_errno bcm_dev_log_cli_get_features(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t n_parms)
{
dev_log_id id;
dev_log_id_parm id_parm;
bcmos_errno err;
id = bcm_dev_log_id_get_by_index(parm[0].value.unumber);
if (id == DEV_LOG_INVALID_ID)
return BCM_ERR_NOENT;
err = bcm_dev_log_id_get(id, &id_parm);
if (err)
{
bcmcli_session_print(session, "Error: can get id (err: %d)\n", err);
return err;
}
bcm_dev_log_cli_session_print_features(session, TAB, &id_parm);
return BCM_ERR_OK;
}
#endif
static int dev_log_cli_session_write_cb(bcmcli_session *cli_session, const char *buf, uint32_t size)
{
bcm_dev_log_cli_session *session = bcmcli_session_user_priv(cli_session);
char tmp_str[DEV_LOG_CLI_SESSION_MAX_MSG_SIZE] = {};
char *p;
uint32_t tmp_str_len;
strncpy(tmp_str, buf, sizeof(tmp_str) - 1); /* leave room for the terminator */
p = tmp_str;
tmp_str_len = strlen(tmp_str);
while (tmp_str_len > session->free_len)
{
/* Not enough space in 'str' for concatenating what's in 'p' -> split it. */
strncat(session->str, p, session->free_len);
bcm_dev_log_log(
session->log_id, session->log_level, BCM_LOG_FLAG_NO_HEADER | BCM_LOG_FLAG_CALLER_FMT, "%s", session->str);
*session->str = '\0';
p += session->free_len;
tmp_str_len -= session->free_len;
session->free_len = MAX_DEV_LOG_STRING_NET_SIZE - 1;
}
/* Enough space in 'str' for concatenating what's in 'p'. */
strncat(session->str, p, tmp_str_len);
session->free_len -= tmp_str_len;
/* If the message is not terminated by '\n', do not submit the message to logger yet
* (rather save it, waiting for a later message with '\n'). */
if (session->str[strlen(session->str) - 1] == '\n')
{
bcm_dev_log_log(
session->log_id, session->log_level, BCM_LOG_FLAG_NO_HEADER | BCM_LOG_FLAG_CALLER_FMT, "%s", session->str);
*session->str = '\0';
session->free_len = MAX_DEV_LOG_STRING_NET_SIZE - 1;
}
return size;
}
bcmos_errno bcm_dev_log_cli_session_create(
dev_log_id log_id,
bcm_dev_log_level log_level,
bcm_dev_log_cli_session **session)
{
bcmos_errno err;
bcmcli_session_parm session_params = { .write = dev_log_cli_session_write_cb };
*session = bcmos_calloc(sizeof(bcm_dev_log_cli_session));
if (*session == NULL)
{
return BCM_ERR_NOMEM;
}
session_params.user_priv = *session;
err = bcmcli_session_open(&session_params, &((*session)->session));
if (err != BCM_ERR_OK)
{
bcmos_free(*session);
*session = NULL;
return err;
}
(*session)->log_id = log_id;
(*session)->log_level = log_level;
(*session)->free_len = MAX_DEV_LOG_STRING_NET_SIZE - 1;
return BCM_ERR_OK;
}
bcmcli_entry *bcm_dev_log_cli_init(bcmcli_entry *root_dir)
{
bcmcli_entry *dir;
static bcmcli_enum_val enum_table_log_level[] =
{
{ .name = "NO_LOG", .val = (long)DEV_LOG_LEVEL_NO_LOG },
{ .name = "FATAL", .val = (long)DEV_LOG_LEVEL_FATAL },
{ .name = "ERROR", .val = (long)DEV_LOG_LEVEL_ERROR },
{ .name = "WARNING", .val = (long)DEV_LOG_LEVEL_WARNING},
{ .name = "INFO", .val = (long)DEV_LOG_LEVEL_INFO },
{ .name = "DEBUG", .val = (long)DEV_LOG_LEVEL_DEBUG },
BCMCLI_ENUM_LAST
};
if ((dir = bcmcli_dir_find(NULL, "logger")) != NULL)
return dir;
dir = bcmcli_dir_add(root_dir, "logger", "Dev Log", BCMCLI_ACCESS_GUEST, NULL);
{
BCMCLI_MAKE_CMD_NOPARM(dir, "print_dev_log", "Print Dev log", bcm_dev_log_cli_print_dev_log);
}
{
BCMCLI_MAKE_CMD(dir, "logger_control", "Logger Control", bcm_dev_log_cli_logger_control,
BCMCLI_MAKE_PARM_RANGE("enable", "enable", BCMCLI_PARM_UDECIMAL, 0, 0, 1));
}
{
BCMCLI_MAKE_CMD(dir, "file_print", "Print logger file", bcm_dev_log_cli_file_print,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_RANGE("clear", "clear", BCMCLI_PARM_UDECIMAL, 0, 0, 1));
}
{
BCMCLI_MAKE_CMD(dir, "file_clear", "Clear file", bcm_dev_log_cli_file_clear,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0));
}
{
static bcmcli_enum_val enum_table_file_flags[] =
{
{ .name = "VALID", .val = (long)BCM_DEV_LOG_FILE_FLAG_VALID },
{ .name = "WRAP_AROUND", .val = (long)BCM_DEV_LOG_FILE_FLAG_WRAP_AROUND },
{ .name = "STOP_WHEN_FULL", .val = (long)BCM_DEV_LOG_FILE_FLAG_STOP_WHEN_FULL },
BCMCLI_ENUM_LAST
};
BCMCLI_MAKE_CMD(dir, "file_set_flags", "Set file flags", bcm_dev_log_cli_file_set_flags,
BCMCLI_MAKE_PARM_RANGE("index", "index", BCMCLI_PARM_UDECIMAL, 0, 0, DEV_LOG_MAX_FILES-1),
BCMCLI_MAKE_PARM_ENUM("flags", "flags", enum_table_file_flags, 0));
}
{
BCMCLI_MAKE_CMD(dir, "file_reset_flags", "Reset file flags", bcm_dev_log_cli_file_reset_flags,
BCMCLI_MAKE_PARM_RANGE("index", "index", BCMCLI_PARM_UDECIMAL, 0, 0, DEV_LOG_MAX_FILES-1));
}
{
static bcmcli_cmd_parm set1[]=
{
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_PARM_LIST_TERMINATOR
};
static bcmcli_cmd_parm set2[] =
{
BCMCLI_MAKE_PARM("name", "name", BCMCLI_PARM_STRING, 0),
BCMCLI_PARM_LIST_TERMINATOR
};
static bcmcli_enum_val selector_table[] =
{
{ .name = "by_index", .val = ID_BY_INDEX, .parms = set1 },
{ .name = "by_name", .val = ID_BY_NAME, .parms = set2 },
BCMCLI_ENUM_LAST
};
BCMCLI_MAKE_CMD(dir, "id_get", "id_get", bcm_dev_log_cli_id_get,
BCMCLI_MAKE_PARM_SELECTOR("by", "by", selector_table, 0));
}
{
static bcmcli_enum_val enum_table[] =
{
{ .name = "none", .val = (long)DEV_LOG_ID_TYPE_NONE },
{ .name = "print", .val = (long)DEV_LOG_ID_TYPE_PRINT },
{ .name = "save", .val = (long)DEV_LOG_ID_TYPE_SAVE },
{ .name = "both", .val = (long)DEV_LOG_ID_TYPE_BOTH },
BCMCLI_ENUM_LAST
};
BCMCLI_MAKE_CMD(dir, "id_set_type", "id_set_type", bcm_dev_log_cli_id_set_type,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_ENUM("log_type", "log_type", enum_table, 0));
}
{
BCMCLI_MAKE_CMD(dir, "id_set_level", "id_set_level", bcm_dev_log_cli_id_set_level,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_print", "log_level", enum_table_log_level, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_save", "log_level", enum_table_log_level, 0));
}
{
BCMCLI_MAKE_CMD(dir, "name_set_level", "name_set_level", bcm_dev_log_cli_name_set_level,
BCMCLI_MAKE_PARM("name", "name", BCMCLI_PARM_STRING, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_print", "log_level", enum_table_log_level, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_save", "log_level", enum_table_log_level, 0));
}
{
BCMCLI_MAKE_CMD(dir, "id_set_to_default", "id_set_to_default", bcm_dev_log_cli_id_set_to_default,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0));
}
{
static bcmcli_enum_val enum_table_log_style[] =
{
{ .name = "normal", .val = (long)BCM_DEV_LOG_STYLE_NORMAL },
{ .name = "bold", .val = (long)BCM_DEV_LOG_STYLE_BOLD },
{ .name = "underline", .val = (long)BCM_DEV_LOG_STYLE_UNDERLINE },
{ .name = "blink", .val = (long)BCM_DEV_LOG_STYLE_BLINK },
{ .name = "reverse_video", .val = (long)BCM_DEV_LOG_STYLE_REVERSE_VIDEO },
BCMCLI_ENUM_LAST
};
BCMCLI_MAKE_CMD(dir, "id_set_style", "id_set_style", bcm_dev_log_cli_id_set_style,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_ENUM("style", "style", enum_table_log_style, 0));
}
{
BCMCLI_MAKE_CMD(dir, "id_clear_counters", "id_clear_counters", bcm_dev_log_cli_id_clear_counters,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0));
}
{
BCMCLI_MAKE_CMD(dir, "log", "log", bcm_dev_log_cli_log,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_print", "log_level", enum_table_log_level, 0),
BCMCLI_MAKE_PARM("string", "string", BCMCLI_PARM_STRING, 0),
BCMCLI_MAKE_PARM("count", "Number of messages to send", BCMCLI_PARM_UDECIMAL, BCMCLI_PARM_FLAG_OPTIONAL));
}
{
BCMCLI_MAKE_CMD(dir, "instance_enable", "enable/disable instance number", bcm_dev_log_cli_instance_enable,
BCMCLI_MAKE_PARM_ENUM("enable", "enable", bcmcli_enum_bool_table, 0),
BCMCLI_MAKE_PARM("instance", "instance number", BCMCLI_PARM_UDECIMAL, 0));
}
#ifdef TRIGGER_LOGGER_FEATURE
{
BCMCLI_MAKE_CMD(dir, "id_set_throttle", "set throttle", bcm_dev_log_cli_throttle,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_print", "log_level", enum_table_log_level, 0),
BCMCLI_MAKE_PARM("throttle", "throttle", BCMCLI_PARM_UDECIMAL, 0));
}
{
BCMCLI_MAKE_CMD(dir, "id_set_trigger", "set trigger", bcm_dev_log_cli_trigger,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM_ENUM("log_level_print", "log_level", enum_table_log_level, 0),
BCMCLI_MAKE_PARM("start", "start", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM("stop", "stop", BCMCLI_PARM_UDECIMAL, 0),
BCMCLI_MAKE_PARM("repeat", "repeat", BCMCLI_PARM_DECIMAL, BCMCLI_PARM_FLAG_OPTIONAL));
}
{
BCMCLI_MAKE_CMD(dir, "id_get_feature", "get feature", bcm_dev_log_cli_get_features,
BCMCLI_MAKE_PARM("index", "index", BCMCLI_PARM_UDECIMAL, 0));
}
#endif
return dir;
}
#endif /* #ifndef __KERNEL__ */