1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2000 Matthew Jacob
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions, and the following disclaimer,
12 * without modification, immediately at the beginning of the file.
13 * 2. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD$
29 */
30
31 /*
32 * This file contains definitions only intended for use within
33 * sys/cam/scsi/scsi_enc*.c, and not in other kernel components.
34 */
35
36 #ifndef __SCSI_ENC_INTERNAL_H__
37 #define __SCSI_ENC_INTERNAL_H__
38
39 #include <sys/sysctl.h>
40
41 typedef struct enc_element {
42 u_int elm_idx; /* index of element */
43 uint8_t elm_type; /* element type */
44 uint8_t subenclosure; /* subenclosure id */
45 uint8_t type_elm_idx; /* index of element within type */
46 uint8_t svalid; /* enclosure information valid */
47 uint8_t encstat[4]; /* state && stats */
48 u_int physical_path_len; /* Length of device path data. */
49 uint8_t *physical_path; /* Device physical path data. */
50 void *elm_private; /* per-type object data */
51 uint16_t priv;
52 } enc_element_t;
53
54 typedef enum {
55 ENC_NONE,
56 ENC_SES,
57 ENC_SES_PASSTHROUGH,
58 ENC_SAFT,
59 ENC_SEMB_SES,
60 ENC_SEMB_SAFT
61 } enctyp;
62
63 /* Platform Independent Driver Internal Definitions for enclosure devices. */
64 typedef struct enc_softc enc_softc_t;
65
66 struct enc_fsm_state;
67 typedef int fsm_fill_handler_t(enc_softc_t *ssc,
68 struct enc_fsm_state *state,
69 union ccb *ccb,
70 uint8_t *buf);
71 typedef int fsm_error_handler_t(union ccb *ccb, uint32_t cflags,
72 uint32_t sflags);
73 typedef int fsm_done_handler_t(enc_softc_t *ssc,
74 struct enc_fsm_state *state, union ccb *ccb,
75 uint8_t **bufp, int error, int xfer_len);
76
77 struct enc_fsm_state {
78 const char *name;
79 int page_code;
80 size_t buf_size;
81 uint32_t timeout;
82 fsm_fill_handler_t *fill;
83 fsm_done_handler_t *done;
84 fsm_error_handler_t *error;
85 };
86
87 typedef int (enc_softc_init_t)(enc_softc_t *);
88 typedef void (enc_softc_invalidate_t)(enc_softc_t *);
89 typedef void (enc_softc_cleanup_t)(enc_softc_t *);
90 typedef int (enc_init_enc_t)(enc_softc_t *);
91 typedef int (enc_get_enc_status_t)(enc_softc_t *, int);
92 typedef int (enc_set_enc_status_t)(enc_softc_t *, encioc_enc_status_t, int);
93 typedef int (enc_get_elm_status_t)(enc_softc_t *, encioc_elm_status_t *, int);
94 typedef int (enc_set_elm_status_t)(enc_softc_t *, encioc_elm_status_t *, int);
95 typedef int (enc_get_elm_desc_t)(enc_softc_t *, encioc_elm_desc_t *);
96 typedef int (enc_get_elm_devnames_t)(enc_softc_t *, encioc_elm_devnames_t *);
97 typedef int (enc_handle_string_t)(enc_softc_t *, encioc_string_t *, int);
98 typedef void (enc_device_found_t)(enc_softc_t *);
99 typedef void (enc_poll_status_t)(enc_softc_t *);
100
101 struct enc_vec {
102 enc_softc_invalidate_t *softc_invalidate;
103 enc_softc_cleanup_t *softc_cleanup;
104 enc_init_enc_t *init_enc;
105 enc_get_enc_status_t *get_enc_status;
106 enc_set_enc_status_t *set_enc_status;
107 enc_get_elm_status_t *get_elm_status;
108 enc_set_elm_status_t *set_elm_status;
109 enc_get_elm_desc_t *get_elm_desc;
110 enc_get_elm_devnames_t *get_elm_devnames;
111 enc_handle_string_t *handle_string;
112 enc_device_found_t *device_found;
113 enc_poll_status_t *poll_status;
114 };
115
116 typedef struct enc_cache {
117 enc_element_t *elm_map; /* objects */
118 int nelms; /* number of objects */
119 encioc_enc_status_t enc_status; /* overall status */
120 void *private; /* per-type private data */
121 } enc_cache_t;
122
123 /* Enclosure instance toplevel structure */
124 struct enc_softc {
125 enctyp enc_type; /* type of enclosure */
126 struct enc_vec enc_vec; /* vector to handlers */
127 void *enc_private; /* per-type private data */
128
129 /**
130 * "Published" configuration and state data available to
131 * external consumers.
132 */
133 enc_cache_t enc_cache;
134
135 /**
136 * Configuration and state data being actively updated
137 * by the enclosure daemon.
138 */
139 enc_cache_t enc_daemon_cache;
140
141 struct sx enc_cache_lock;
142 uint8_t enc_flags;
143 #define ENC_FLAG_INVALID 0x01
144 #define ENC_FLAG_INITIALIZED 0x02
145 #define ENC_FLAG_SHUTDOWN 0x04
146 union ccb saved_ccb;
147 struct cdev *enc_dev;
148 struct cam_periph *periph;
149 int open_count;
150
151 /* Bitmap of pending operations. */
152 uint32_t pending_actions;
153
154 /* The action on which the state machine is currently working. */
155 uint32_t current_action;
156 #define ENC_UPDATE_NONE 0x00
157 #define ENC_UPDATE_INVALID 0xff
158
159 /* Callout for auto-updating enclosure status */
160 struct callout status_updater;
161
162 struct proc *enc_daemon;
163
164 struct enc_fsm_state *enc_fsm_states;
165
166 struct root_hold_token enc_rootmount;
167
168 #define ENC_ANNOUNCE_SZ 400
169 char announce_buf[ENC_ANNOUNCE_SZ];
170 };
171
172 static inline enc_cache_t *
173 enc_other_cache(enc_softc_t *enc, enc_cache_t *primary)
174 {
175 return (primary == &enc->enc_cache
176 ? &enc->enc_daemon_cache : &enc->enc_cache);
177 }
178
179 /* SES Management mode page - SES2r20 Table 59 */
180 struct ses_mgmt_mode_page {
181 struct scsi_mode_header_6 header;
182 struct scsi_mode_blk_desc blk_desc;
183 uint8_t byte0; /* ps : 1, spf : 1, page_code : 6 */
184 #define SES_MGMT_MODE_PAGE_CODE 0x14
185 uint8_t length;
186 #define SES_MGMT_MODE_PAGE_LEN 6
187 uint8_t reserved[3];
188 uint8_t byte5; /* reserved : 7, enbltc : 1 */
189 #define SES_MGMT_TIMED_COMP_EN 0x1
190 uint8_t max_comp_time[2];
191 };
192
193 /* Enclosure core interface for sub-drivers */
194 int enc_runcmd(struct enc_softc *, char *, int, char *, int *);
195 void enc_log(struct enc_softc *, const char *, ...);
196 int enc_error(union ccb *, uint32_t, uint32_t);
197 void enc_update_request(enc_softc_t *, uint32_t);
198
199 /* SES Native interface */
200 enc_softc_init_t ses_softc_init;
201
202 /* SAF-TE interface */
203 enc_softc_init_t safte_softc_init;
204
205 SYSCTL_DECL(_kern_cam_enc);
206 extern int enc_verbose;
207
208 /* Helper macros */
209 MALLOC_DECLARE(M_SCSIENC);
210 #define ENC_CFLAGS CAM_RETRY_SELTO
211 #define ENC_FLAGS SF_NO_PRINT | SF_RETRY_UA
212 #define STRNCMP strncmp
213 #define PRINTF printf
214 #define ENC_LOG enc_log
215 #if defined(DEBUG) || defined(ENC_DEBUG)
216 #define ENC_DLOG enc_log
217 #else
218 #define ENC_DLOG if (0) enc_log
219 #endif
220 #define ENC_VLOG if (enc_verbose) enc_log
221 #define ENC_MALLOC(amt) malloc(amt, M_SCSIENC, M_NOWAIT)
222 #define ENC_MALLOCZ(amt) malloc(amt, M_SCSIENC, M_ZERO|M_NOWAIT)
223 /* Cast away const avoiding GCC warnings. */
224 #define ENC_FREE(ptr) free((void *)((uintptr_t)ptr), M_SCSIENC)
225 #define ENC_FREE_AND_NULL(ptr) do { \
226 if (ptr != NULL) { \
227 ENC_FREE(ptr); \
228 ptr = NULL; \
229 } \
230 } while(0)
231 #define MEMZERO bzero
232 #define MEMCPY(dest, src, amt) bcopy(src, dest, amt)
233
234 #endif /* __SCSI_ENC_INTERNAL_H__ */
Cache object: be3ab5349502575b678ed9f83f0e0e1f
|