/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved.
*/
#ifndef _ASM_IA64_SN_IOERROR_HANDLING_H
#define _ASM_IA64_SN_IOERROR_HANDLING_H
#include <linux/types.h>
#include <asm/sn/sgi.h>
#if __KERNEL__
/*
* Basic types required for io error handling interfaces.
*/
/*
* Return code from the io error handling interfaces.
*/
enum error_return_code_e {
/* Success */
ERROR_RETURN_CODE_SUCCESS,
/* Unknown failure */
ERROR_RETURN_CODE_GENERAL_FAILURE,
/* Nth error noticed while handling the first error */
ERROR_RETURN_CODE_NESTED_CALL,
/* State of the vertex is invalid */
ERROR_RETURN_CODE_INVALID_STATE,
/* Invalid action */
ERROR_RETURN_CODE_INVALID_ACTION,
/* Valid action but not cannot set it */
ERROR_RETURN_CODE_CANNOT_SET_ACTION,
/* Valid action but not possible for the current state */
ERROR_RETURN_CODE_CANNOT_PERFORM_ACTION,
/* Valid state but cannot change the state of the vertex to it */
ERROR_RETURN_CODE_CANNOT_SET_STATE,
/* ??? */
ERROR_RETURN_CODE_DUPLICATE,
/* Reached the root of the system critical graph */
ERROR_RETURN_CODE_SYS_CRITICAL_GRAPH_BEGIN,
/* Reached the leaf of the system critical graph */
ERROR_RETURN_CODE_SYS_CRITICAL_GRAPH_ADD,
/* Cannot shutdown the device in hw/sw */
ERROR_RETURN_CODE_SHUTDOWN_FAILED,
/* Cannot restart the device in hw/sw */
ERROR_RETURN_CODE_RESET_FAILED,
/* Cannot failover the io subsystem */
ERROR_RETURN_CODE_FAILOVER_FAILED,
/* No Jump Buffer exists */
ERROR_RETURN_CODE_NO_JUMP_BUFFER
};
typedef uint64_t error_return_code_t;
/*
* State of the vertex during error handling.
*/
enum error_state_e {
/* Ignore state */
ERROR_STATE_IGNORE,
/* Invalid state */
ERROR_STATE_NONE,
/* Trying to decipher the error bits */
ERROR_STATE_LOOKUP,
/* Trying to carryout the action decided upon after
* looking at the error bits
*/
ERROR_STATE_ACTION,
/* Donot allow any other operations to this vertex from
* other parts of the kernel. This is also used to indicate
* that the device has been software shutdown.
*/
ERROR_STATE_SHUTDOWN,
/* This is a transitory state when no new requests are accepted
* on behalf of the device. This is usually used when trying to
* quiesce all the outstanding operations and preparing the
* device for a failover / shutdown etc.
*/
ERROR_STATE_SHUTDOWN_IN_PROGRESS,
/* This is the state when there is absolutely no activity going
* on wrt device.
*/
ERROR_STATE_SHUTDOWN_COMPLETE,
/* This is the state when the device has issued a retry. */
ERROR_STATE_RETRY,
/* This is the normal state. This can also be used to indicate
* that the device has been software-enabled after software-
* shutting down previously.
*/
ERROR_STATE_NORMAL
};
typedef uint64_t error_state_t;
/*
* Generic error classes. This is used to classify errors after looking
* at the error bits and helpful in deciding on the action.
*/
enum error_class_e {
/* Unclassified error */
ERROR_CLASS_UNKNOWN,
/* LLP transmit error */
ERROR_CLASS_LLP_XMIT,
/* LLP receive error */
ERROR_CLASS_LLP_RECV,
/* Credit error */
ERROR_CLASS_CREDIT,
/* Timeout error */
ERROR_CLASS_TIMEOUT,
/* Access error */
ERROR_CLASS_ACCESS,
/* System coherency error */
ERROR_CLASS_SYS_COHERENCY,
/* Bad data error (ecc / parity etc) */
ERROR_CLASS_BAD_DATA,
/* Illegal request packet */
ERROR_CLASS_BAD_REQ_PKT,
/* Illegal response packet */
ERROR_CLASS_BAD_RESP_PKT
};
typedef uint64_t error_class_t;
/*
* Error context which the error action can use.
*/
typedef void *error_context_t;
#define ERROR_CONTEXT_IGNORE ((error_context_t)-1ll)
/*
* Error action type.
*/
typedef error_return_code_t (*error_action_f)( error_context_t);
#define ERROR_ACTION_IGNORE ((error_action_f)-1ll)
/* Typical set of error actions */
typedef struct error_action_set_s {
error_action_f eas_panic;
error_action_f eas_shutdown;
error_action_f eas_abort;
error_action_f eas_retry;
error_action_f eas_failover;
error_action_f eas_log_n_ignore;
error_action_f eas_reset;
} error_action_set_t;
/* Set of priorites for in case mutliple error actions/states
* are trying to be prescribed for a device.
* NOTE : The ordering below encapsulates the priorities. Highest value
* corresponds to highest priority.
*/
enum error_priority_e {
ERROR_PRIORITY_IGNORE,
ERROR_PRIORITY_NONE,
ERROR_PRIORITY_NORMAL,
ERROR_PRIORITY_LOG,
ERROR_PRIORITY_FAILOVER,
ERROR_PRIORITY_RETRY,
ERROR_PRIORITY_ABORT,
ERROR_PRIORITY_SHUTDOWN,
ERROR_PRIORITY_RESTART,
ERROR_PRIORITY_PANIC
};
typedef uint64_t error_priority_t;
/* Error action interfaces */
extern error_return_code_t error_action_set(vertex_hdl_t,
error_action_f,
error_context_t,
error_priority_t);
extern error_return_code_t error_action_perform(vertex_hdl_t);
#define INFO_LBL_ERROR_SKIP_ENV "error_skip_env"
#define v_error_skip_env_get(v, l) \
hwgraph_info_get_LBL(v, INFO_LBL_ERROR_SKIP_ENV, (arbitrary_info_t *)&l)
#define v_error_skip_env_set(v, l, r) \
(r ? \
hwgraph_info_replace_LBL(v, INFO_LBL_ERROR_SKIP_ENV, (arbitrary_info_t)l,0) :\
hwgraph_info_add_LBL(v, INFO_LBL_ERROR_SKIP_ENV, (arbitrary_info_t)l))
#define v_error_skip_env_clear(v) \
hwgraph_info_remove_LBL(v, INFO_LBL_ERROR_SKIP_ENV, 0)
typedef uint64_t counter_t;
extern counter_t error_retry_count_get(vertex_hdl_t);
extern error_return_code_t error_retry_count_set(vertex_hdl_t,counter_t);
extern counter_t error_retry_count_increment(vertex_hdl_t);
extern counter_t error_retry_count_decrement(vertex_hdl_t);
/* Except for the PIO Read error typically the other errors are handled in
* the context of an asynchronous error interrupt.
*/
#define IS_ERROR_INTR_CONTEXT(_ec) ((_ec & IOECODE_DMA) || \
(_ec == IOECODE_PIO_WRITE))
#endif /* __KERNEL__ */
#endif /* _ASM_IA64_SN_IOERROR_HANDLING_H */