1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef	_SMP_IMPL_H
27 #define	_SMP_IMPL_H
28 
29 #ifdef	__cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/scsi/generic/smp_frames.h>
34 
35 #include <scsi/libsmp.h>
36 #include <scsi/libsmp_plugin.h>
37 
38 #include <pthread.h>
39 
40 #define	LIBSMP_ERRMSGLEN	512
41 
42 #define	LIBSMP_DEFAULT_PLUGINDIR	"/usr/lib/scsi/plugins/smp"
43 #define	LIBSMP_PLUGIN_ENGINE		"engine"
44 #define	LIBSMP_PLUGIN_FRAMEWORK		"framework"
45 #define	LIBSMP_PLUGIN_VENDOR		"vendor"
46 
47 #define	LIBSMP_PLUGIN_EXT		".so"
48 
49 #define	LIBSMP_DEFAULT_ENGINE		"usmp"
50 
51 struct smp_engine {
52 	char *se_name;
53 	const smp_engine_ops_t *se_ops;
54 	void *se_object;
55 	int (*se_init)(struct smp_engine *);
56 	void (*se_fini)(struct smp_engine *);
57 	uint_t se_refcnt;
58 	struct smp_engine *se_next;
59 };
60 
61 struct smp_plugin {
62 	struct smp_plugin *sp_next;
63 	struct smp_plugin *sp_prev;
64 	smp_target_t *sp_target;
65 	uint64_t sp_priority;
66 	void *sp_object;
67 	void *sp_data;
68 	boolean_t sp_initialized;
69 	const smp_function_def_t *sp_functions;
70 	int (*sp_init)(smp_plugin_t *);
71 	void (*sp_fini)(smp_plugin_t *);
72 };
73 
74 #define	SMP_ACTION_F_OFFSET		0x01
75 #define	SMP_ACTION_F_EXEC		0x02
76 #define	SMP_ACTION_F_DECODE		0x04
77 
78 struct smp_action {
79 	uint32_t sa_timeout;
80 	const smp_function_def_t *sa_def;
81 	uint8_t *sa_request;
82 	size_t sa_request_rqsd;
83 	size_t sa_request_alloc_len;
84 	off_t sa_request_data_off;
85 	uint8_t *sa_response;
86 	size_t sa_response_alloc_len;
87 	size_t sa_response_engine_len;
88 	size_t sa_response_data_len;
89 	off_t sa_response_data_off;
90 	smp_result_t sa_result;
91 	uint_t sa_flags;
92 	uint_t sa_cap;
93 	uint8_t sa_buf[1];
94 };
95 
96 struct smp_target {
97 	smp_engine_t *st_engine;
98 	void *st_priv;
99 	uint_t st_mtbf_request;
100 	uint_t st_mtbf_response;
101 	uint16_t st_change_count;
102 	smp_plugin_t *st_plugin_first;
103 	smp_plugin_t *st_plugin_last;
104 	char *st_vendor;
105 	char *st_product;
106 	char *st_revision;
107 	char *st_component_vendor;
108 	uint16_t st_component_id;
109 	uint8_t st_component_revision;
110 	smp_report_general_resp_t st_repgen;
111 };
112 
113 extern void smp_engine_init(void);
114 extern void smp_engine_fini(void);
115 
116 extern int smp_plugin_load(smp_target_t *);
117 extern void smp_plugin_unload(smp_target_t *);
118 
119 #ifdef	__cplusplus
120 }
121 #endif
122 
123 #endif	/* _SMP_IMPL_H */
124