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