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