xref: /titanic_44/usr/src/lib/fm/libseslog/common/libseslog.h (revision 6a634c9dca3093f3922e4b7ab826d7bdf17bf78e)
1*e4f5a11dSJames Kremer /*
2*e4f5a11dSJames Kremer  * CDDL HEADER START
3*e4f5a11dSJames Kremer  *
4*e4f5a11dSJames Kremer  * The contents of this file are subject to the terms of the
5*e4f5a11dSJames Kremer  * Common Development and Distribution License (the "License").
6*e4f5a11dSJames Kremer  * You may not use this file except in compliance with the License.
7*e4f5a11dSJames Kremer  *
8*e4f5a11dSJames Kremer  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*e4f5a11dSJames Kremer  * or http://www.opensolaris.org/os/licensing.
10*e4f5a11dSJames Kremer  * See the License for the specific language governing permissions
11*e4f5a11dSJames Kremer  * and limitations under the License.
12*e4f5a11dSJames Kremer  *
13*e4f5a11dSJames Kremer  * When distributing Covered Code, include this CDDL HEADER in each
14*e4f5a11dSJames Kremer  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*e4f5a11dSJames Kremer  * If applicable, add the following below this CDDL HEADER, with the
16*e4f5a11dSJames Kremer  * fields enclosed by brackets "[]" replaced with your own identifying
17*e4f5a11dSJames Kremer  * information: Portions Copyright [yyyy] [name of copyright owner]
18*e4f5a11dSJames Kremer  *
19*e4f5a11dSJames Kremer  * CDDL HEADER END
20*e4f5a11dSJames Kremer  */
21*e4f5a11dSJames Kremer /*
22*e4f5a11dSJames Kremer  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*e4f5a11dSJames Kremer  */
24*e4f5a11dSJames Kremer 
25*e4f5a11dSJames Kremer 
26*e4f5a11dSJames Kremer 
27*e4f5a11dSJames Kremer #ifndef	_LIBSESLOG_H
28*e4f5a11dSJames Kremer #define	_LIBSESLOG_H
29*e4f5a11dSJames Kremer 
30*e4f5a11dSJames Kremer #include <libnvpair.h>
31*e4f5a11dSJames Kremer #include <sys/types.h>
32*e4f5a11dSJames Kremer #include <sys/scsi/impl/uscsi.h>
33*e4f5a11dSJames Kremer 
34*e4f5a11dSJames Kremer #ifdef	__cplusplus
35*e4f5a11dSJames Kremer extern "C" {
36*e4f5a11dSJames Kremer #endif
37*e4f5a11dSJames Kremer 
38*e4f5a11dSJames Kremer /*
39*e4f5a11dSJames Kremer  * Error definitions
40*e4f5a11dSJames Kremer  */
41*e4f5a11dSJames Kremer 
42*e4f5a11dSJames Kremer enum {
435cf8276bSTodd McKenney 	SES_LOG_FAILED_TO_OPEN_DEVICE = 1, /* Couldn't open dev path */
44*e4f5a11dSJames Kremer 	SES_LOG_FAILED_TO_READ_DEVICE,	/* Couldn't read the log data */
45*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NULL_TARGET_PATH,	/* Null target path */
46*e4f5a11dSJames Kremer 	SES_LOG_FAILED_BAD_TARGET_PATH,	/* Couldn't find valid target path */
47*e4f5a11dSJames Kremer 	SES_LOG_FAILED_MODE_SENSE,    	/* Mode sense error returned */
48*e4f5a11dSJames Kremer 	SES_LOG_FAILED_MODE_SENSE_OFFSET,	/* Offset not correct */
49*e4f5a11dSJames Kremer 	SES_LOG_FAILED_BAD_DATA_LEN, 	/* Data length not correct */
50*e4f5a11dSJames Kremer 	SES_LOG_FAILED_BAD_CONTENT_LEN,	/* Content length not correct */
515cf8276bSTodd McKenney 	SES_LOG_FAILED_FORMAT_PAGE_ERR,	/* Device doesn't support page */
52*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NV_UNIQUE,	/* Couldn't add unique to nvlist */
53*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NV_LOG,		/* Couldn't add log to nvlist */
54*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NV_CODE,		/* Couldn't add code to nvlist */
55*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NV_SEV,		/* Couldn't add sev to nvlist */
56*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NV_ENTRY,    	/* Couldn't add entry to nvlist */
57*e4f5a11dSJames Kremer 	SES_LOG_FAILED_MODE_SELECT,	/* Mode select failed */
58*e4f5a11dSJames Kremer 	SES_LOG_FAILED_NVLIST_CREATE	/* Couldn't create a nvlist */
59*e4f5a11dSJames Kremer };
60*e4f5a11dSJames Kremer 
61*e4f5a11dSJames Kremer /*
62*e4f5a11dSJames Kremer  * define different levels of log entries that could be returned
63*e4f5a11dSJames Kremer  */
64*e4f5a11dSJames Kremer #define	SES_LOG_LEVEL_NOTICE 0
65*e4f5a11dSJames Kremer #define	SES_LOG_LEVEL_DEBUG 1
66*e4f5a11dSJames Kremer #define	SES_LOG_LEVEL_WARNING 2
675cf8276bSTodd McKenney #define	SES_LOG_LEVEL_NO_MASK 3
685cf8276bSTodd McKenney #define	SES_LOG_LEVEL_ERROR 4
695cf8276bSTodd McKenney #define	SES_LOG_LEVEL_FATAL 5
70*e4f5a11dSJames Kremer 
71*e4f5a11dSJames Kremer /* Valid size of log entry being returned by expander */
72*e4f5a11dSJames Kremer #define	SES_LOG_VALID_LOG_SIZE 71
735cf8276bSTodd McKenney 
745cf8276bSTodd McKenney /* The string log is made from 8 char entries */
755cf8276bSTodd McKenney #define	SES_LOG_SPECIFIC_ENTRY_SIZE 8
765cf8276bSTodd McKenney 
77*e4f5a11dSJames Kremer /* Index of where sequence number starts in returned string */
78*e4f5a11dSJames Kremer #define	SES_LOG_SEQ_NUM_START 27
795cf8276bSTodd McKenney /* Index of where log code starts */
805cf8276bSTodd McKenney #define	SES_LOG_CODE_START 36
81*e4f5a11dSJames Kremer /* Index of where log level starts in returned string */
82*e4f5a11dSJames Kremer #define	SES_LOG_LEVEL_START 40
83*e4f5a11dSJames Kremer 
845cf8276bSTodd McKenney /* Maximum size the each sub log entry can be */
855cf8276bSTodd McKenney #define	ENTRY_MAX_SIZE	10
865cf8276bSTodd McKenney /* Maximum save buffer log entry size */
875cf8276bSTodd McKenney #define	MAX_LOG_ENTRY_SZ	256
88*e4f5a11dSJames Kremer 
895cf8276bSTodd McKenney #define	MAX_ALLOC_LEN (0xfffc)
90*e4f5a11dSJames Kremer /*
91*e4f5a11dSJames Kremer  * Sense return buffer length
92*e4f5a11dSJames Kremer  * Arbitrary, could be larger
93*e4f5a11dSJames Kremer  */
94*e4f5a11dSJames Kremer #define	SENSE_BUFF_LEN	32
95*e4f5a11dSJames Kremer /*
965cf8276bSTodd McKenney  * 60 seconds for SCSI timeout
97*e4f5a11dSJames Kremer  */
98*e4f5a11dSJames Kremer #define	DEF_PT_TIMEOUT	60
99*e4f5a11dSJames Kremer 
100*e4f5a11dSJames Kremer 
101*e4f5a11dSJames Kremer /*
102*e4f5a11dSJames Kremer  * Defines for different SCSI cmd paramters
103*e4f5a11dSJames Kremer  */
104*e4f5a11dSJames Kremer #define	MODE_SELECT10_CMDLEN  10
105*e4f5a11dSJames Kremer #define	MODE10_RESP_HDR_LEN   8
106*e4f5a11dSJames Kremer #define	MODE_SENSE10_CMDLEN   10
107*e4f5a11dSJames Kremer 
108*e4f5a11dSJames Kremer 
109*e4f5a11dSJames Kremer /*
110*e4f5a11dSJames Kremer  * Defines for nvlist entries
111*e4f5a11dSJames Kremer  */
112*e4f5a11dSJames Kremer #define	ENTRY_PREFIX	"entry"
113*e4f5a11dSJames Kremer #define	ENTRY_SEVERITY	"severity"
114*e4f5a11dSJames Kremer #define	ENTRY_CODE	"code"
115*e4f5a11dSJames Kremer #define	ENTRY_LOG	"log"
116*e4f5a11dSJames Kremer 
117*e4f5a11dSJames Kremer 
118*e4f5a11dSJames Kremer 
119*e4f5a11dSJames Kremer /*
120*e4f5a11dSJames Kremer  * Genesis specific log clear control struct
121*e4f5a11dSJames Kremer  */
122*e4f5a11dSJames Kremer struct log_clear_control_struct {
123*e4f5a11dSJames Kremer 	unsigned char pageControls;
124*e4f5a11dSJames Kremer 	uint8_t subpage_code;
125*e4f5a11dSJames Kremer 	uint8_t page_lengthUpper;
126*e4f5a11dSJames Kremer 	uint8_t page_lengthLower;
127*e4f5a11dSJames Kremer 	uint8_t host_id[16];
128*e4f5a11dSJames Kremer 	uint8_t seq_clear[4];
129*e4f5a11dSJames Kremer 	uint8_t timeout[2];
130*e4f5a11dSJames Kremer };
131*e4f5a11dSJames Kremer 
132*e4f5a11dSJames Kremer 
133*e4f5a11dSJames Kremer 
134*e4f5a11dSJames Kremer /*
135*e4f5a11dSJames Kremer  * Struct to contain information needed to read logs
136*e4f5a11dSJames Kremer  */
1375cf8276bSTodd McKenney typedef struct ses_log_call_struct {
138*e4f5a11dSJames Kremer 	char target_path[MAXPATHLEN]; /* Path to device, passed in */
139*e4f5a11dSJames Kremer 	char product_id[MAXNAMELEN]; /* product id of expander, passed in */
140*e4f5a11dSJames Kremer 	hrtime_t poll_time; /* nanosecond poll time, passed in */
141*e4f5a11dSJames Kremer 	char last_log_entry[MAXNAMELEN]; /* Last entry read, passed in/out */
142*e4f5a11dSJames Kremer 	int number_log_entries;  /* num of log entries read, passed back */
143*e4f5a11dSJames Kremer 	int size_of_log_entries; /* Total size of all logs read passed back */
144*e4f5a11dSJames Kremer 	nvlist_t *log_data;  /* Log data being returned, passed back */
1455cf8276bSTodd McKenney } ses_log_call_t;
146*e4f5a11dSJames Kremer 
147*e4f5a11dSJames Kremer /*
148*e4f5a11dSJames Kremer  * Basic library functions
149*e4f5a11dSJames Kremer  */
150*e4f5a11dSJames Kremer extern int access_ses_log(struct ses_log_call_struct *);
151*e4f5a11dSJames Kremer 
152*e4f5a11dSJames Kremer 
153*e4f5a11dSJames Kremer #ifdef	__cplusplus
154*e4f5a11dSJames Kremer }
155*e4f5a11dSJames Kremer #endif
156*e4f5a11dSJames Kremer 
157*e4f5a11dSJames Kremer #endif	/* _LIBSESLOG_H */
158