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 9 * http://www.opensource.org/licenses/cddl1.txt. 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) 2004-2011 Emulex. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _EMLXS_SDAPI_H 28 #define _EMLXS_SDAPI_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* 35 * Although information in this file can be used by app, libdfc or driver, 36 * its purpose is for communication between app and libdfc. 37 * Its content come from the SAN Diag API Specification. 38 */ 39 40 41 /* Define for refering SCSI_IO_LATENCY */ 42 #define SD_SCSI_IO_LATENCY_TYPE 0x01 43 44 #define SD_IO_LATENCY_MAX_BUCKETS 20 /* Size of array range */ 45 46 /* Masks for ELS Commands */ 47 #define SD_ELS_SUBCATEGORY_PLOGI_RCV 0x01 48 #define SD_ELS_SUBCATEGORY_PRLO_RCV 0x02 49 #define SD_ELS_SUBCATEGORY_ADISC_RCV 0x04 50 #define SD_ELS_SUBCATEGORY_LSRJT_RCV 0x08 51 #define SD_ELS_SUBCATEGORY_LOGO_RCV 0x10 52 #define SD_ELS_SUBCATEGORY_RSCN_RCV 0x20 53 54 /* Masks for Fabric events */ 55 #define SD_FABRIC_SUBCATEGORY_FABRIC_BUSY 0x01 56 #define SD_FABRIC_SUBCATEGORY_PORT_BUSY 0x02 57 #define SD_FABRIC_SUBCATEGORY_FCPRDCHKERR 0x04 58 59 /* Masks for SCSI events */ 60 #define SD_SCSI_SUBCATEGORY_QFULL 0x0001 61 #define SD_SCSI_SUBCATEGORY_DEVBSY 0x0002 62 #define SD_SCSI_SUBCATEGORY_CHECKCONDITION 0x0004 63 #define SD_SCSI_SUBCATEGORY_LUNRESET 0x0008 64 #define SD_SCSI_SUBCATEGORY_TGTRESET 0x0010 65 #define SD_SCSI_SUBCATEGORY_BUSRESET 0x0020 66 #define SD_SCSI_SUBCATEGORY_VARQUEDEPTH 0x0040 67 68 /* Masks for Board Events */ 69 #define SD_BOARD_SUBCATEGORY_PORTINTERR 0x01 70 #define SD_BOARD_SUBCATEGORY_LINKATTE 0x02 71 72 /* Masks for Adapter Events */ 73 #define SD_ADAPTER_SUBCATEGORY_ARRIVAL 0x01 74 #define SD_ADAPTER_SUBCATEGORY_DEPARTURE 0x02 75 76 /* Struct to hold SCSI IO Latency statistics per bucket */ 77 struct SD_time_stats_v0 { 78 int sd_tstats_bucket_count; 79 }; 80 81 /* Struct per target for SCSI IO Latency */ 82 struct SD_IO_Latency_Response { 83 HBA_WWN sd_iolatency_target_wwpn; 84 /* Size of array depends on range size */ 85 struct SD_time_stats_v0 sd_time_stats_array[SD_IO_LATENCY_MAX_BUCKETS]; 86 }; 87 88 /* Return Codes */ 89 enum SD_RETURN_CODES { 90 SD_OK, 91 SD_ERROR_GENERIC, 92 SD_ERROR_ARG, 93 SD_ERROR_INVALID_BOARD_ID, 94 SD_ERROR_INVALID_VPORT, 95 SD_ERROR_NOT_SUPPORTED, 96 SD_ERROR_CATEGORY_NOT_SUPPORTED, 97 SD_ERROR_SUBCATEGORY_NOT_SUPPORTED, 98 SD_ERROR_MORE_DATA_AVAILABLE, 99 SD_ERROR_EVENT_ALREADY_REGISTERED, 100 SD_ERROR_NO_ACTIVE_REGISTRATION, 101 SD_ERROR_ARG_MISSING, 102 SD_ERROR_NO_MEMORY, 103 SD_ERROR_BUCKET_NOTSET, 104 SD_ERROR_REG_HANDLE, 105 SD_ERROR_INVALID_SEARCH_TYPE, 106 SD_ERROR_FUNCTION_NOT_SUPPORTED, 107 SD_ERROR_OUT_OF_HANDLES, 108 SD_ERROR_LIB_NOT_INIT, 109 SD_ERROR_DATA_COLLECTION_ACTIVE, 110 SD_ERROR_DATA_COLLECTION_NOT_ACTIVE, 111 SD_MAX_RETURN_CODES 112 }; 113 114 115 #define SD_SEARCH_LINEAR 0x01 116 #define SD_SEARCH_POWER_2 0x02 117 118 119 extern uint32_t DFC_SD_Get_Granularity(void); 120 121 extern int32_t DFC_SD_Set_Bucket(uint16_t type, 122 uint16_t search_type, 123 uint32_t base, 124 uint32_t step); 125 126 extern int32_t DFC_SD_Destroy_Bucket(uint16_t type); 127 128 extern int32_t DFC_SD_Get_Bucket(uint16_t type, 129 uint16_t *search_type, 130 uint32_t *base, 131 uint32_t *step, 132 uint64_t *values); 133 134 extern int32_t DFC_SD_Start_Data_Collection(uint32_t board, 135 HBA_WWN port_id, 136 uint16_t type, 137 void *arg); 138 139 extern int32_t DFC_SD_Stop_Data_Collection(uint32_t board, 140 HBA_WWN port_id, 141 uint16_t type); 142 143 extern int32_t DFC_SD_Reset_Data_Collection(uint32_t board, 144 HBA_WWN port_id, 145 uint16_t type); 146 147 extern int32_t DFC_SD_Get_Data(uint32_t board, 148 HBA_WWN port_id, 149 uint16_t type, 150 uint16_t *target, 151 uint32_t buf_size, 152 void *buff); 153 154 #define SD_REG_ELS_EVENT 0x01 155 #define SD_REG_FABRIC_EVENT 0x02 156 #define SD_REG_SCSI_EVENT 0x04 157 #define SD_REG_BOARD_EVENT 0x08 158 #define SD_REG_ADAPTER_EVENT 0x10 159 160 161 #define SD_ELS_SUBCATEGORY_VALID_MASK (SD_ELS_SUBCATEGORY_PLOGI_RCV | \ 162 SD_ELS_SUBCATEGORY_PRLO_RCV | SD_ELS_SUBCATEGORY_ADISC_RCV | \ 163 SD_ELS_SUBCATEGORY_LSRJT_RCV | SD_ELS_SUBCATEGORY_LOGO_RCV | \ 164 SD_ELS_SUBCATEGORY_RSCN_RCV) 165 166 167 /* Generic Payload */ 168 struct sd_event { 169 uint32_t sd_evt_version; 170 size_t sd_evt_size; 171 void *sd_evt_payload; 172 }; 173 174 175 struct sd_els_event_details_v0 { 176 uint32_t sd_elsevt_version; 177 void *sd_elsevt_payload; 178 }; 179 180 181 struct sd_plogi_rcv_v0 { 182 uint32_t sd_plogir_version; 183 HBA_WWN sd_plogir_portname; 184 HBA_WWN sd_plogir_nodename; 185 }; 186 187 188 struct sd_prlo_rcv_v0 { 189 uint32_t sd_prlor_version; 190 HBA_WWN sd_prlor_remoteport; 191 }; 192 193 194 struct sd_lsrjt_rcv_v0 { 195 uint32_t sd_lsrjtr_version; 196 HBA_WWN sd_lsrjtr_remoteport; 197 uint32_t sd_lsrjtr_original_cmd; 198 uint32_t sd_lsrjtr_reasoncode; 199 uint32_t sd_lsrjtr_reasoncodeexpl; 200 }; 201 202 203 struct sd_adisc_rcv_v0 { 204 uint32_t sd_adiscr_version; 205 HBA_WWN sd_adiscr_portname; 206 HBA_WWN sd_adiscr_nodename; 207 }; 208 209 210 #define SD_FABRIC_SUBCATEGORY_VALID_MASK (\ 211 SD_FABRIC_SUBCATEGORY_FABRIC_BUSY | SD_FABRIC_SUBCATEGORY_PORT_BUSY | \ 212 SD_FABRIC_SUBCATEGORY_FCPRDCHKERR) 213 214 215 struct sd_fabric_event_details_v0 { 216 uint32_t sd_fabric_evt_version; 217 void *sd_fabric_evt_payload; 218 }; 219 220 221 struct sd_pbsy_rcv_v0 { 222 uint32_t sd_pbsyr_evt_version; 223 HBA_WWN sd_pbsyr_rport; 224 }; 225 226 227 struct sd_fcprdchkerr_v0 { 228 uint32_t sd_fcprdchkerr_version; 229 HBA_WWN sd_fcprdchkerr_rport; 230 uint32_t sd_fcprdchkerr_lun; 231 uint32_t sd_fcprdchkerr_opcode; 232 uint32_t sd_fcprdchkerr_fcpiparam; 233 }; 234 235 236 #define SD_SCSI_SUBCATEGORY_VALID_MASK (\ 237 SD_SCSI_SUBCATEGORY_QFULL | SD_SCSI_SUBCATEGORY_DEVBSY | \ 238 SD_SCSI_SUBCATEGORY_CHECKCONDITION | SD_SCSI_SUBCATEGORY_LUNRESET | \ 239 SD_SCSI_SUBCATEGORY_TGTRESET | SD_SCSI_SUBCATEGORY_BUSRESET | \ 240 SD_SCSI_SUBCATEGORY_VARQUEDEPTH) 241 242 struct sd_scsi_event_details_v0 { 243 uint32_t sd_scsi_evt_version; 244 void *sd_scsi_evt_payload; 245 }; 246 247 248 struct sd_scsi_generic_v0 { 249 uint32_t sd_scsi_generic_version; 250 HBA_WWN sd_scsi_generic_rport; 251 int32_t sd_scsi_generic_lun; 252 }; 253 254 255 struct sd_scsi_checkcond_v0 { 256 uint32_t sd_scsi_checkcond_version; 257 HBA_WWN sd_scsi_checkcond_rport; 258 uint32_t sd_scsi_checkcond_lun; 259 uint32_t sd_scsi_checkcond_cmdcode; 260 uint32_t sd_scsi_checkcond_sensekey; 261 uint32_t sd_scsi_checkcond_asc; 262 uint32_t sd_scsi_checkcond_ascq; 263 }; 264 265 266 struct sd_scsi_varquedepth_v0 { 267 uint32_t sd_varquedepth_version; 268 HBA_WWN sd_varquedepth_rport; 269 int32_t sd_varquedepth_lun; 270 uint32_t sd_varquedepth_oldval; 271 uint32_t sd_varquedepth_newval; 272 }; 273 274 275 /* Prototype for callback */ 276 typedef void sd_callback(uint32_t board_id, 277 HBA_WWN ort_id, 278 uint32_t category, 279 uint32_t subcategory, 280 void *context, 281 struct sd_event *sd_data); 282 283 /* Register for event */ 284 extern int32_t DFC_SD_RegisterForEvent(uint32_t board_id, 285 HBA_WWN port_id, 286 uint32_t category, 287 uint32_t subcategory, 288 void *context, 289 uint32_t *reg_handle, 290 sd_callback *func); 291 292 293 /* Deregister a event */ 294 extern int32_t DFC_SD_unRegisterForEvent(uint32_t board_id, 295 HBA_WWN vport_id, 296 uint32_t reg_handle); 297 298 299 #ifdef __cplusplus 300 } 301 #endif 302 303 #endif /* _EMLXS_SDAPI_H */ 304