// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (c) 2019 Broadcom
 */
/*
 * 
 */

/*******************************************************************
 * bdmf_errno.h
 *
 * BDMF framework - generic error codes
 *******************************************************************/

#ifndef BDMF_ERRNO_H
#define BDMF_ERRNO_H

/* Generic error codes */
typedef enum {
	BDMF_ERR_OK		=  0,   /**< OK */
	BDMF_ERR_PARM		= -1,   /**< Error in parameters */
	BDMF_ERR_NOMEM		= -2,   /**< No memory */
	BDMF_ERR_NORES		= -3,   /**< No resources */
	BDMF_ERR_INTERNAL	= -4,   /**< Internal error */
	BDMF_ERR_NOENT		= -5,   /**< Entry doesn't exist */
	BDMF_ERR_NODEV		= -6,   /**< Device doesn't exist */
	BDMF_ERR_ALREADY	= -7,   /**< Entry already exists */
	BDMF_ERR_RANGE		= -8,   /**< Out of range */
	BDMF_ERR_PERM		= -9,   /**< No permission to perform an operation */
	BDMF_ERR_NOT_SUPPORTED	= -10,  /**< Operation is not supported */
	BDMF_ERR_PARSE		= -11,  /**< Parsing error */
	BDMF_ERR_INVALID_OP	= -12,  /**< Invalid operation */
	BDMF_ERR_IO		= -13,  /**< I/O error */
	BDMF_ERR_STATE		= -14,  /**< Object is in bad state */
	BDMF_ERR_DELETED	= -15,  /**< Object is deleted */
	BDMF_ERR_TOO_MANY	= -16,  /**< Too many objects */
	BDMF_ERR_NOT_LINKED	= -17,  /**< Objects are not linked */
	BDMF_ERR_NO_MORE	= -18,  /**< No more entries */
	BDMF_ERR_OVERFLOW	= -19,  /**< Buffer overflow */
	BDMF_ERR_COMM_FAIL	= -20,  /**< Communication failure */
	BDMF_ERR_NOT_CONNECTED	= -21,  /**< No connection with the target system */
	BDMF_ERR_SYSCALL_ERR	= -22,  /**< System call returned error */
	BDMF_ERR_MSG_ERROR	= -23,  /**< Received message is insane */
	BDMF_ERR_TOO_MANY_REQS	= -24,  /**< Too many outstanding requests */
	BDMF_ERR_NO_MSG_SERVER	= -25,  /**< Remote delivery error. No message server. */
	BDMF_ERR_NO_LOCAL_SUBS	= -26,  /**< Local subsystem is not set */
	BDMF_ERR_NO_SUBS	= -27,  /**< Subsystem is not recognised */
	BDMF_ERR_INTR		= -28,  /**< Operation interrupted */
	BDMF_ERR_HIST_RES_MISMATCH= -29,  /**< History result mismatch */
	BDMF_ERR_MORE		= -30,  /**< More work to do */
	BDMF_ERR_IGNORE		= -31,  /**< Ignore the error */
	BDMF_ERR_LAST		= -100,	/**< Last generic error */
} bdmf_error_t;

/* Register error code range
 * \param[in]	from - From number. Must be negative
 * \param[in]	to - To number. Must be negative >from
 * \param[in]	p_strerr - Callback that returns error string
 *
 * \returns	BDMF_ERR_OK - OK\n
 *		BDMF_ERR_PARM - error in parameters\n
 *		BDMF_ERR_NOMEM - no memory
 *		BDMF_ERR_ALREADY - (from, to) range overlaps with existing range
 */
bdmf_error_t bdmf_error_range_register(int from, int to,
				       const char *(*p_strerr)(int err));

/* Unregister error code range
 * \param[in]	from - From number. Must be negative
 * \param[in]	to - To number. Must be negative >from
 *
 * \returns	BDMF_ERR_OK - OK\n
 *		BDMF_ERR_PARM - error in parameters\n
 *		BDMF_ERR_NOENT - (from, to) range is not registered
 */
bdmf_error_t bdmf_error_range_unregister(int from, int to);

/* Convert error code to error string
 * \param[in]	err - Error code. One of bdmf_error_t constants or additional
 *		      codes registered using bdmf_error_register()
 * \returns	Error string
 */
const char *bdmf_strerror(int err);

#endif /* #ifndef BDMF_ERRNO_H */

