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