blob: 227bb129868390c58af7c0bf4489666b757454d1 [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.
:>
*/
#ifndef __BCM_DEV_LOG_TASK_H_
#define __BCM_DEV_LOG_TASK_H_
/* Because we cast from dev_log_id to pointer type in bcm_dev_log.c, we want it to be the same size as a pointer size (e.g: "typedef uint32_t dev_log_id" won't work
* on 64bit platform). */
typedef unsigned long dev_log_id;
#define DEV_LOG_INVALID_ID (dev_log_id)UINT_MAX
#ifdef ENABLE_LOG
/* Uncomment the following line to enable info prints for dev_log debugging */
/* #define DEV_LOG_DEBUG */
#include <bcmos_system.h>
/********************************************/
/* */
/* Log macros */
/* */
/********************************************/
/********************************************/
/* */
/* Defines/Typedefs */
/* */
/********************************************/
#define STRINGIFY(x) #x
#define STRINGIFY_EXPAND(str) STRINGIFY(str)
#ifdef __KERNEL__
#define DEV_LOG_PRINTF printk
#define DEV_LOG_VPRINTF vprintk
#else
#define DEV_LOG_PRINTF bcmos_printf
#define DEV_LOG_VPRINTF bcmos_vprintf
#endif
#ifdef DEV_LOG_DEBUG
#define DEV_LOG_INFO_PRINTF(fmt, args...) DEV_LOG_PRINTF("(%s:" STRINGIFY_EXPAND(__LINE__) ") " fmt, __FUNCTION__, ##args)
#else
static inline void dev_log_info_printf_ignore(const char *fmt, ...) { }
#define DEV_LOG_INFO_PRINTF(fmt, args...) dev_log_info_printf_ignore(fmt, ##args)
#endif
#define DEV_LOG_ERROR_PRINTF(fmt, args...) DEV_LOG_PRINTF("(%s:" STRINGIFY_EXPAND(__LINE__) ") " fmt, __FUNCTION__, ##args)
/* IMPORTANT! when modifying DEV_LOG_MAX_ARGS,
* don't forget to add/remove _BCM_LOG_ARGS... macros in order to force number of arguments in compile time
*/
#define DEV_LOG_MAX_ARGS 36
/* String bigger than this size will be cut */
#define MAX_DEV_LOG_ID_NAME 32 /* Maximum size of log_id name */
#define DEV_LOG_MAX_IDS 512
#define DEV_LOG_MAX_FILES 2
#define MAX_DEV_LOG_STRING_SIZE 256 /* Note that this size includes header. */
#define MAX_DEV_LOG_HEADER_SIZE (7 + 16 + 20) /* (time=16, ID=20, delimiters=7) */
#define MAX_DEV_LOG_STRING_NET_SIZE (MAX_DEV_LOG_STRING_SIZE - MAX_DEV_LOG_HEADER_SIZE)
#define DEV_LOG_INVALID_INDEX UINT_MAX
#define DEV_LOG_DROP_REPORT_RATE_US 1000000 /* 1 second */
#define DEV_LOG_DROP_REPORT_DROP_THRESHOLD 1000
#define DEV_LOG_ENDIAN BCMOS_ENDIAN_LITTLE
/* If the log message pool utilization is >= this percentage, do not print messages (only save them).
* (note that error/fatal messages will not objey this rule). */
#define DEV_LOG_SKIP_PRINT_THRESHOLD_PERCENT 50
/* If the log message pool utilization is >= this percentage, drop all messages that aren't 'error' or 'fatal' level. */
#define DEV_LOG_ERROR_ONLY_THRESHOLD_PERCENT 75
/* Log level enum */
typedef enum
{
DEV_LOG_LEVEL_NO_LOG = 0,
DEV_LOG_LEVEL_FATAL,
DEV_LOG_LEVEL_ERROR,
DEV_LOG_LEVEL_WARNING,
DEV_LOG_LEVEL_INFO,
DEV_LOG_LEVEL_DEBUG,
DEV_LOG_LEVEL_NUM_OF
} bcm_dev_log_level;
/* Log type enum */
typedef enum
{
/* Bit[0] - Print Enable, Bit[1] - Save Enable */
DEV_LOG_ID_TYPE_NONE = 0, /* NO SAVE, NO PRINT*/
DEV_LOG_ID_TYPE_PRINT = 1,
DEV_LOG_ID_TYPE_SAVE = 1 << 1,
DEV_LOG_ID_TYPE_BOTH = DEV_LOG_ID_TYPE_PRINT | DEV_LOG_ID_TYPE_SAVE, /* SAVE & PRINT */
} bcm_dev_log_id_type;
typedef enum
{
BCM_DEV_LOG_FLAG_NONE = 0,
/* Even if logger is disabled, BCM_LOG() calls are redirected to bcmos_printf(). */
BCM_DEV_LOG_FLAG_DISABLED_WITH_PRINTF = 1 << 0,
/* When bcm_dev_log_destroy() is called, do not wait for outstanding log messages to be drained. Discard the
* messages and destroy the task immediately. */
BCM_DEV_LOG_FLAG_DESTROY_IMMEDIATELY = 1 << 1,
} bcm_dev_log_flags;
typedef enum
{
BCM_DEV_LOG_FILE_FLAG_NONE = 0,
BCM_DEV_LOG_FILE_FLAG_VALID = 1, /**< file is valid */
BCM_DEV_LOG_FILE_FLAG_WRAP_AROUND = 1 << 1, /**< new messages will override old */
BCM_DEV_LOG_FILE_FLAG_STOP_WHEN_FULL = 1 << 2, /**< stop logging if the file is full */
BCM_DEV_LOG_FILE_FLAG_CLEAR_AFTER_READ = 1 << 4, /**< auto-clear log when it is fully read */
} bcm_dev_log_file_flags;
typedef enum
{
BCM_DEV_LOG_STYLE_NORMAL,
BCM_DEV_LOG_STYLE_BOLD,
BCM_DEV_LOG_STYLE_UNDERLINE,
BCM_DEV_LOG_STYLE_BLINK,
BCM_DEV_LOG_STYLE_REVERSE_VIDEO,
} bcm_dev_log_style;
/********************************************/
/* */
/* Callbacks functions */
/* */
/********************************************/
/* Default logger ID */
extern dev_log_id def_log_id;
/* Log file type */
typedef enum
{
BCM_DEV_LOG_FILE_MEMORY, /**< Memory file */
#ifdef BCM_OS_POSIX
BCM_DEV_LOG_FILE_REGULAR, /**< Regular file */
#endif
#ifdef DEV_LOG_SYSLOG
BCM_DEV_LOG_FILE_SYSLOG, /**< syslog "file" */
#endif
BCM_DEV_LOG_FILE_UDEF /**< User-defined file */
} bcm_dev_log_file_type;
typedef struct bcm_dev_log_file_parm bcm_dev_log_file_parm;
typedef struct bcm_dev_log_file bcm_dev_log_file;
/****************************************************************************************/
/* OPEN CALLBACK: open memory/file */
/* file_parm - file parameters */
/* file - file */
/****************************************************************************************/
typedef bcmos_errno (*bcm_dev_log_file_open_cb)(const bcm_dev_log_file_parm *file_parm, bcm_dev_log_file *file);
/****************************************************************************************/
/* CLOSE CALLBACK: close memory/file */
/* file - file handle */
/****************************************************************************************/
typedef bcmos_errno (*bcm_dev_log_file_close_cb)(bcm_dev_log_file *file);
/****************************************************************************************/
/* REWIND CALLBACK: clears memory/file */
/* file - file handle */
/****************************************************************************************/
typedef bcmos_errno (*bcm_dev_log_file_rewind_cb)(bcm_dev_log_file *file);
/****************************************************************************************/
/* READ_CALLBACK: read form memory/file */
/* offset - the offset in bytes to read from, output */
/* buf - Where to put the result */
/* length - Buffer length */
/* This function should return the number of bytes actually read from file or 0 if EOF */
/****************************************************************************************/
typedef int (*bcm_dev_log_file_read_cb)(bcm_dev_log_file *file, uint32_t *offset, void *buf, uint32_t length);
/****************************************************************************************/
/* WRITE_CALLBACK: write form memory/file */
/* buf - The buffer that should be written */
/* length - The number of bytes to write */
/* This function should return the number of bytes actually written to file or 0 if EOF */
/****************************************************************************************/
typedef int (*bcm_dev_log_file_write_cb)(bcm_dev_log_file *file, const void *buf, uint32_t length);
/* File almost full indication callback prototype */
typedef bcmos_errno (*F_dev_log_file_almost_full)(long priv);
/* File parameters */
struct bcm_dev_log_file_parm
{
bcm_dev_log_file_type type;
/* File-access callbacks can be NULL for memory files, in this case start_addr */
/* should be a valid memory address, all read/writes options will be */
/* performed directly to this memory */
void *start_addr;
uint32_t size;
bcm_dev_log_file_open_cb open_cb;
bcm_dev_log_file_close_cb close_cb;
bcm_dev_log_file_write_cb write_cb;
bcm_dev_log_file_read_cb read_cb;
bcm_dev_log_file_rewind_cb rewind_cb;
bcm_dev_log_file_flags flags;
void *udef_parms;
};
#define FILE_MAGIC_STR_SIZE 16
#define FILE_MAGIC_STR "@LOGFILE MAGIC@" /* length should be FILE_MAGIC_STR_SIZE (including '\0') */
/* File almost full indication control info */
typedef struct dev_log_almost_full_info
{
F_dev_log_file_almost_full send_ind_cb;
uint32_t threshold;
bcmos_bool ind_sent;
long priv;
} dev_log_almost_full_info;
/* Memory file header */
typedef struct dev_log_mem_file_header
{
uint32_t file_wrap_cnt;
uint32_t write_offset;
uint32_t data_size;
uint32_t num_msgs;
char file_magic[FILE_MAGIC_STR_SIZE];
char msg_buffer[0];
} dev_log_mem_file_header;
struct bcm_dev_log_file
{
bcm_dev_log_file_parm file_parm;
dev_log_almost_full_info almost_full;
bcmos_bool is_full;
union
{
/* Memory file */
struct
{
bcmos_mutex mutex; /* Mutex to lock file access while printing it */
dev_log_mem_file_header file_header;
} mem_file;
#ifdef BCM_OS_POSIX
FILE *reg_file_handle;
#endif
/* User-defined file handle */
unsigned long udef_handle;
} u;
};
/*******************************************************************************************************/
/* Get time callback should return an integer representing time. If NULL time prints will be disabled. */
/*******************************************************************************************************/
typedef uint32_t (*bcm_dev_log_get_time_cb)(void);
/********************************************************************************************************/
/* Time to string callback receives timestamp (us) and should convert into time_str */
/* time_str_size is the maximum number of bytes to be copied. In the end function should update the */
/* number bytes actually written */
/* If NULL time will printed as an unsigned integer. */
/********************************************************************************************************/
typedef int (*bcm_dev_log_time_to_str_cb)(uint32_t time, char *time_str, int time_str_size);
typedef int (*bcm_dev_log_print_cb)(void *arg, const char *fmt, ...);
/********************************************/
/* */
/* Structs */
/* */
/********************************************/
typedef struct
{
bcm_dev_log_get_time_cb get_time_cb;
bcm_dev_log_time_to_str_cb time_to_str_cb;
bcm_dev_log_print_cb print_cb;
void *print_cb_arg;
bcm_dev_log_file_parm log_file[DEV_LOG_MAX_FILES];
} bcm_dev_log_parm;
#ifdef TRIGGER_LOGGER_FEATURE
typedef struct
{
uint32_t threshold; /* every threshold messages, print one */
uint32_t counter; /* current index - runs from 0 to threshold, periodically */
} dev_log_id_throttle;
typedef struct
{
uint32_t start_threshold; /* start printing when threshold is reached */
uint32_t stop_threshold; /* stop printing when threshold is reached, starting counting from start, if 0, do no stop */
uint32_t counter; /* current index - runs : first - from 0 to start_threshold
second - from start_threshold to stop_threshold */
int32_t repeat_threshold;/* the trigger period, how many times the trigger is set, -1 = always */
int32_t repeat; /* current repeat counter */
} dev_log_id_trigger;
#endif
typedef struct
{
char name[MAX_DEV_LOG_ID_NAME];
bcm_dev_log_id_type log_type;
bcm_dev_log_id_type default_log_type;
bcm_dev_log_level log_level_print;
bcm_dev_log_level log_level_save;
bcm_dev_log_level default_log_level;
bcm_dev_log_style style;
uint32_t lost_msg_cnt;
uint32_t print_skipped_count; /* see DEV_LOG_SKIP_PRINT_THRESHOLD_PERCENT */
uint32_t counters[DEV_LOG_LEVEL_NUM_OF];
#ifdef TRIGGER_LOGGER_FEATURE
bcm_dev_log_level throttle_log_level;
dev_log_id_throttle throttle;
bcm_dev_log_level trigger_log_level;
dev_log_id_trigger trigger;
#endif
} dev_log_id_parm;
/********************************************/
/* */
/* Functions prototypes */
/* */
/********************************************/
/** Tear down the dev_log, freeing all OS resources. */
void bcm_dev_log_destroy(void);
/* This function creates default logger that supports logging on the screen and
* into 0 or more memory files.
*/
bcmos_errno bcm_dev_log_init_default_logger(void **start_addresses,
uint32_t *sizes,
bcm_dev_log_file_flags *flags,
uint32_t num_files,
uint32_t stack_size,
bcmos_task_priority priority,
uint32_t pool_size);
/* This function is more flexible comparing with bcm_dev_log_init_default_logger().
* It creates logger that supports logging on the screen and into 0 or more
* memory, regular and user-defined files.
*/
bcmos_errno bcm_dev_log_init_default_logger_ext(
bcm_dev_log_parm *dev_log_parm,
uint32_t num_files,
uint32_t stack_size,
bcmos_task_priority priority,
uint32_t pool_size);
/************************************************************************/
/* */
/* Name: bcm_dev_log_id_register */
/* */
/* Abstract: Add new ID to dev_log and return it to user */
/* */
/* Arguments: */
/* xi_name - ID name */
/* xi_default_log_level - ID default log level */
/* xi_default_log_type - ID default log type */
/* */
/* Return Value: */
/* new ID */
/* */
/************************************************************************/
dev_log_id bcm_dev_log_id_register(const char *xi_name,
bcm_dev_log_level xi_default_log_level,
bcm_dev_log_id_type xi_default_log_type);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_id_set_type */
/* */
/* Abstract: Set current log type for an ID */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* - xi_log_type - New log type */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
bcmos_errno bcm_dev_log_id_set_type(dev_log_id xi_id, bcm_dev_log_id_type xi_log_type);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_id_set_level */
/* */
/* Abstract: Set current log level for an ID */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* - xi_log_level - New log level */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
bcmos_errno bcm_dev_log_id_set_level(dev_log_id xi_id, bcm_dev_log_level xi_log_level_print, bcm_dev_log_level xi_log_level_save);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_id_set_to_default */
/* */
/* Abstract: Set log_type and log_level to default (creation) values for an ID */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
bcmos_errno bcm_dev_log_id_set_levels_and_type_to_default(dev_log_id xi_id);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_level_set_style */
/* */
/* Abstract: Set log style per level */
/* */
/* Arguments: */
/* - xi_level - Log level */
/* - xi_style - The style of the log, NORMAL, BOLD, UNDERLINE, BLINK, REVERSE_VIDEO */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
void bcm_dev_log_level_set_style(bcm_dev_log_level level, bcm_dev_log_style xi_style);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_id_set_style */
/* */
/* Abstract: Set log style per log id */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* - xi_style - The style of the log, NORMAL, BOLD, UNDERLINE, BLINK, REVERSE_VIDEO */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
bcmos_errno bcm_dev_log_id_set_style(dev_log_id xi_id, bcm_dev_log_style xi_style);
/************************************************************************************************/
/* */
/* Name: bcm_dev_log_id_clear_counters */
/* */
/* Abstract: Clear counter for an ID */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/************************************************************************************************/
bcmos_errno bcm_dev_log_id_clear_counters(dev_log_id xi_id);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_id_get */
/* */
/* Abstract: Get the ID status (type, level, counters ...) */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* - xo_id_status - Returned status structure */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
bcmos_errno bcm_dev_log_id_get(dev_log_id xi_id, dev_log_id_parm *xo_id_status);
/********************************************************************************************/
/* */
/* Name: bcm_dev_log_id_set */
/* */
/* Abstract: set the ID status (type, level, style ...) */
/* */
/* Arguments: */
/* - xi_id - The ID in the Dev log (what we got form bcm_dev_log_id_register) */
/* - xi_parms - structure to set */
/* */
/* Return Value: */
/* bcmos_errno - Success code (BCM_ERR_OK) or Error code (see bcmos_errno.h) */
/* */
/********************************************************************************************/
bcmos_errno bcm_dev_log_id_set(dev_log_id xi_id, dev_log_id_parm *xi_parms);
/********************************************************************************/
/* */
/* Name: bcm_dev_log_id_get_by_index */
/* */
/* Abstract: Return ID for index, if no such index return (DEV_LOG_INVALID_ID) */
/* */
/* Arguments: */
/* xi_index - The index of the ID in the global array. */
/* */
/* Return Value: */
/* uint32_t - The ID (DEV_LOG_INVALID_ID if index is not valid) */
/* */
/********************************************************************************/
dev_log_id bcm_dev_log_id_get_by_index(uint32_t xi_index);
/********************************************************************************/
/* */
/* Name: bcm_dev_log_get_index_by_id */
/* */
/* Abstract: Return ID for index, if no such index return (DEV_LOG_INVALID_ID) */
/* */
/* Arguments: */
/* xi_id - Log id. */
/* */
/* Return Value: */
/* uint32_t - The index ID (DEV_LOG_INVALID_INDEX if id is not valid) */
/* */
/********************************************************************************/
uint32_t bcm_dev_log_get_index_by_id(dev_log_id xi_id);
/********************************************************************************/
/* */
/* Name: bcm_dev_log_id_get_by_name */
/* */
/* Abstract: Return ID index for name */
/* */
/* Arguments: */
/* xi__name - The name of the ID */
/* */
/* Return Value: */
/* int32_t - The ID index (-1 if name is not valid) */
/* */
/********************************************************************************/
dev_log_id bcm_dev_log_id_get_by_name(const char* xi_name);
uint32_t bcm_dev_log_get_num_of_entries(void);
bcmos_bool bcm_dev_log_get_control(void);
void bcm_dev_log_set_control(bcmos_bool control);
bcm_dev_log_file_flags bcm_dev_log_get_file_flags(uint32_t file_id);
void bcm_dev_log_set_file_flags(uint32_t file_id, bcm_dev_log_file_flags flags);
bcm_dev_log_flags bcm_dev_log_get_flags(void);
void bcm_dev_log_set_flags(bcm_dev_log_flags flags);
void bcm_dev_log_set_print_cb(bcm_dev_log_print_cb cb);
void bcm_dev_log_set_get_time_cb(bcm_dev_log_get_time_cb cb);
void bcm_dev_log_set_time_to_str_cb(bcm_dev_log_time_to_str_cb cb);
/* File index to file handle */
bcm_dev_log_file *bcm_dev_log_file_get(uint32_t file_index);
/* Get number of messages stored in the file */
uint32_t bcm_dev_log_get_num_of_messages(bcm_dev_log_file *file);
/* Get file info: max data size, used bytes */
bcmos_errno bcm_dev_log_get_file_info(bcm_dev_log_file *file, uint32_t *file_size, uint32_t *used_bytes);
/* Read from file.
* \param[in] file File to read from
* \param[in,out] offset offset to read from. 0=read from the start
* \param[in,out] buf buffer to read records to
* \param[in] buf_len buf size
* \returns - number of bytes read >= 0 or bcmos_errno < 0
* 0 = no more records to read
* BCM_ERR_OVERFLOW - buffer is too short for log record
*/
int bcm_dev_log_file_read(bcm_dev_log_file *file, uint32_t *offset, char *buf, uint32_t buf_len);
/* Clear file
* \param[in] file File handle
* \returns bcmos_errno error code
*/
bcmos_errno bcm_dev_log_file_clear(bcm_dev_log_file *file);
/* Attach file to memory buffer.
* The file data can be read using bcm_dev_log_file_read or bcm_dev_log_file_read_cut
* \param[in] buf buffer to be interpreted as memory file
* \param[in] buf_len buf size
* \param[out] file File handle.
* file_handle has to be destroyed using bcm_dev_log_file_detach() when no longer needed.
* \returns bcmos_errno error code
*/
bcmos_errno bcm_dev_log_file_attach(void *buf, uint32_t buf_len, bcm_dev_log_file *file);
/* Detach file handle from memory buffer.
* Following this call, the file handle becomes invalid
* \param[in] file File handle.
* \returns bcmos_errno error code
*/
bcmos_errno bcm_dev_log_file_detach(bcm_dev_log_file *file);
/* Register indication to be sent when file utilization crosses threshold */
bcmos_errno bcm_dev_log_almost_full_ind_register(bcm_dev_log_file *file, uint32_t used_bytes_threshold,
F_dev_log_file_almost_full send_ind_cb, long ind_cb_priv);
void dev_log_get_log_name_table(char *buffer, uint32_t buf_len);
void bcm_dev_log_drop_report(void);
/** Helper function to determine if a given log level qualifies as an error. */
static inline bcmos_bool bcm_dev_log_level_is_error(bcm_dev_log_level log_level)
{
return log_level == DEV_LOG_LEVEL_FATAL || log_level == DEV_LOG_LEVEL_ERROR;
}
/** Returns the percentage (0 - 100) of the msg pool that is currently in use. */
uint8_t bcm_dev_log_pool_occupancy_percent_get(void);
#ifdef TRIGGER_LOGGER_FEATURE
bcmos_errno bcm_dev_log_set_throttle(dev_log_id xi_id, bcm_dev_log_level xi_log_level, uint32_t xi_throttle);
bcmos_errno bcm_dev_log_set_trigger(dev_log_id xi_id, bcm_dev_log_level xi_log_level, uint32_t xi_start, uint32_t xi_stop, int32_t xi_repeat);
#endif /* TRIGGER_LOGGER_FEATURE */
#endif /* ENABLE_LOG */
#endif /* __BCM_DEV_LOG_TASK_H_ */