scsi_enc_internal.h revision 235911
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: head/sys/cam/scsi/scsi_enc_internal.h 235911 2012-05-24 14:07:44Z mav $ 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 37typedef 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 54typedef 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. */ 66typedef struct enc_softc enc_softc_t; 67 68struct enc_fsm_state; 69typedef int fsm_fill_handler_t(enc_softc_t *ssc, 70 struct enc_fsm_state *state, 71 union ccb *ccb, 72 uint8_t *buf); 73typedef int fsm_error_handler_t(union ccb *ccb, uint32_t cflags, 74 uint32_t sflags); 75typedef 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 79struct 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 89typedef int (enc_softc_init_t)(enc_softc_t *); 90typedef void (enc_softc_invalidate_t)(enc_softc_t *); 91typedef void (enc_softc_cleanup_t)(enc_softc_t *); 92typedef int (enc_init_enc_t)(enc_softc_t *); 93typedef int (enc_get_enc_status_t)(enc_softc_t *, int); 94typedef int (enc_set_enc_status_t)(enc_softc_t *, encioc_enc_status_t, int); 95typedef int (enc_get_elm_status_t)(enc_softc_t *, encioc_elm_status_t *, int); 96typedef int (enc_set_elm_status_t)(enc_softc_t *, encioc_elm_status_t *, int); 97typedef int (enc_get_elm_desc_t)(enc_softc_t *, encioc_elm_desc_t *); 98typedef int (enc_get_elm_devnames_t)(enc_softc_t *, encioc_elm_devnames_t *); 99typedef int (enc_handle_string_t)(enc_softc_t *, encioc_string_t *, int); 100typedef void (enc_device_found_t)(enc_softc_t *); 101typedef void (enc_poll_status_t)(enc_softc_t *); 102 103struct 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 118typedef 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 */ 126struct 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 152 /* Bitmap of pending operations. */ 153 uint32_t pending_actions; 154 155 /* The action on which the state machine is currently working. */ 156 uint32_t current_action; 157#define ENC_UPDATE_NONE 0x00 158#define ENC_UPDATE_INVALID 0xff 159 160 /* Callout for auto-updating enclosure status */ 161 struct callout status_updater; 162 163 struct proc *enc_daemon; 164 165 struct enc_fsm_state *enc_fsm_states; 166 167 struct intr_config_hook enc_boot_hold_ch; 168}; 169 170static inline enc_cache_t * 171enc_other_cache(enc_softc_t *enc, enc_cache_t *primary) 172{ 173 return (primary == &enc->enc_cache 174 ? &enc->enc_daemon_cache : &enc->enc_cache); 175} 176 177/* SES Management mode page - SES2r20 Table 59 */ 178struct ses_mgmt_mode_page { 179 struct scsi_mode_header_6 header; 180 struct scsi_mode_blk_desc blk_desc; 181 uint8_t byte0; /* ps : 1, spf : 1, page_code : 6 */ 182#define SES_MGMT_MODE_PAGE_CODE 0x14 183 uint8_t length; 184#define SES_MGMT_MODE_PAGE_LEN 6 185 uint8_t reserved[3]; 186 uint8_t byte5; /* reserved : 7, enbltc : 1 */ 187#define SES_MGMT_TIMED_COMP_EN 0x1 188 uint8_t max_comp_time[2]; 189}; 190 191/* Enclosure core interface for sub-drivers */ 192int enc_runcmd(struct enc_softc *, char *, int, char *, int *); 193void enc_log(struct enc_softc *, const char *, ...); 194void enc_done(struct cam_periph *, union ccb *); 195int enc_error(union ccb *, uint32_t, uint32_t); 196void enc_update_request(enc_softc_t *, uint32_t); 197 198/* SES Native interface */ 199enc_softc_init_t ses_softc_init; 200 201/* SAF-TE interface */ 202enc_softc_init_t safte_softc_init; 203 204/* Helper macros */ 205MALLOC_DECLARE(M_SCSIENC); 206#define ENC_CFLAGS CAM_RETRY_SELTO 207#define ENC_FLAGS SF_NO_PRINT | SF_RETRY_UA 208#define STRNCMP strncmp 209#define PRINTF printf 210#define ENC_LOG enc_log 211#if defined(DEBUG) || defined(ENC_DEBUG) 212#define ENC_DLOG enc_log 213#else 214#define ENC_DLOG if (0) enc_log 215#endif 216#define ENC_VLOG if (bootverbose) enc_log 217#define ENC_MALLOC(amt) malloc(amt, M_SCSIENC, M_NOWAIT) 218#define ENC_MALLOCZ(amt) malloc(amt, M_SCSIENC, M_ZERO|M_NOWAIT) 219/* Cast away const avoiding GCC warnings. */ 220#define ENC_FREE(ptr) free((void *)((uintptr_t)ptr), M_SCSIENC) 221#define ENC_FREE_AND_NULL(ptr) do { \ 222 if (ptr != NULL) { \ 223 ENC_FREE(ptr); \ 224 ptr = NULL; \ 225 } \ 226} while(0) 227#define MEMZERO bzero 228#define MEMCPY(dest, src, amt) bcopy(src, dest, amt) 229 230#endif /* __SCSI_ENC_INTERNAL_H__ */ 231