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 usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 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 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _G_STATE_H 27 #define _G_STATE_H 28 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* 35 * Include any headers you depend on. 36 */ 37 38 /* 39 * I18N message number ranges 40 * This file: 19000 - 19499 41 * Shared common messages: 1 - 1999 42 */ 43 44 #include <libdevice.h> 45 #include <sys/fibre-channel/fcio.h> 46 #include <sys/sunmdi.h> 47 /* 48 * sys/fc4/fcio.h includes sys/fc4/fcal_linkapp.h. The following #define 49 * keeps from actually including the contents of sys/fc4/fcal_linkapp.h 50 * since that file contains the same structure definitions as sys/fc4/fcio.h. 51 */ 52 #define _SYS_FC4_FCAL_LINKAPP_H 53 #include <sys/fc4/fcio.h> 54 #include <sys/devctl.h> 55 #include <g_scsi.h> 56 #include <sys/scsi/generic/commands.h> 57 #include <libnvpair.h> 58 #include <libdevinfo.h> 59 60 #define MAXPATHSTATE 5 61 62 #include <gfc.h> 63 64 /* hotplug defines */ 65 #define SENA 1 66 #define NON_SENA 0 67 /* format parameters to dump() */ 68 #define HEX_ONLY 0 /* Print Hex only */ 69 #define HEX_ASCII 1 /* Print Hex and Ascii */ 70 /* Persistent Reservation */ 71 #define ACTION_READ_KEYS 0x00 72 #define ACTION_READ_RESERV 0x01 73 #define ACTION_REGISTER 0x00 74 #define ACTION_RESERVE 0x01 75 #define ACTION_RELEASE 0x02 76 #define ACTION_CLEAR 0x03 77 #define ACTION_PREEMPT 0x04 78 #define ACTION_PREEMPT_CLR 0x05 79 80 /* Some constants for fabric/public loops */ 81 #define AREA_DOMAIN_ID 0x00FFFF00 82 83 /* Max number of retries */ 84 #define RETRY_FCIO_IOCTL 360 85 #define RETRY_FCP_IOCTL 360 86 #define RETRY_OBJECT_OPEN 5 87 #define RETRY_PATHLIST 1 88 89 /* Wait times in microseconds */ 90 #define WAIT_FCIO_IOCTL 250000 /* 1/4 of a second */ 91 #define WAIT_FCP_IOCTL 250000 /* 1/4 of a second */ 92 #define WAIT_OBJECT_OPEN 10000 /* 1/100 of a sec. */ 93 94 /* Defines for VS inq_port field on standard page (bit 5 Byte 6 */ 95 #define PATH_PRIMARY 0x0 96 #define PATH_FAILOVER 0x1 97 98 /* 99 * Macro for deallocating memory pointed by dev_addr pointer 100 * of gfc_map_t structure. 101 * It is defined here to make available at any place from 102 * luxadm, liba5k and libg_fc. 103 * 104 * Note: The macro will try to free any non-NULL dev_addr. 105 * So, dev_addr ptr needs to be initialized to NULL. 106 * 107 * map.dev_addr = (gfc_port_dev_info_t *)NULL 108 * map->dev_addr = (gfc_port_dev_info_t *)NULL. 109 */ 110 #define FREE_DEV_ADDR(D_PTR) if (D_PTR != NULL) {\ 111 free((void *)D_PTR);\ 112 D_PTR = (gfc_port_dev_info_t *)NULL;\ 113 } 114 115 /* Constants and macros used by the g_get_path_type() function */ 116 #define SLASH "/" 117 #define DEV_PREFIX "/devices/" /* base pathname for devfs names */ 118 #define DEV_PREFIX_LEN 9 /* Length of DEV_PREFIX string */ 119 /* Can do a strlen and generalize */ 120 /* but this is is easier */ 121 #define DEVICES_DIR "/devices" 122 123 /* Defines for minor names used to append to devfs paths */ 124 #define SSD_MINOR_NAME ":c,raw" 125 #define ST_MINOR_NAME ":n" 126 127 /* Defines for ssd driver name passed to root tree search routines */ 128 #define SSD_DRVR_NAME "ssd" 129 #define ST_DRVR_NAME "st" 130 131 /* 132 * Property names 133 */ 134 #define PORT_WWN_PROP "port-wwn" 135 #define NODE_WWN_PROP "node-wwn" 136 #define LUN_GUID_PROP "client-guid" 137 #define LUN_PROP "lun" 138 139 typedef struct read_keys_struct { 140 int rk_generation; 141 int rk_length; 142 int rk_key[256]; 143 } Read_keys; 144 145 typedef struct read_reserv_struct { 146 int rr_generation; 147 int rr_length; 148 } Read_reserv; 149 150 /* 151 * mplist structure typedef to support multipath 152 */ 153 typedef struct mplist_struct { 154 char *devpath; 155 struct mplist_struct *next; 156 } Mplist; 157 158 /* wwn_list_found to track previous calls to g_get_wwn */ 159 typedef struct wwn_list_found_struct { 160 uchar_t node_wwn[WWN_SIZE]; 161 uchar_t port_wwn[WWN_SIZE]; 162 struct wwn_list_found_struct *wwn_next; 163 } WWN_list_found; 164 165 /* Function prototyes defined for libg_fc modules */ 166 /* genf.c */ 167 extern void *g_zalloc(int); 168 extern char *g_alloc_string(char *); 169 extern void g_destroy_data(void *); 170 extern void g_dump(char *, uchar_t *, int, int); 171 extern int g_object_open(char *, int); 172 extern char *g_scsi_find_command_name(int); 173 extern void g_scsi_printerr(struct uscsi_cmd *, 174 struct scsi_extended_sense *, int, char msg_string[], char *); 175 extern int g_get_machineArch(int *); 176 extern boolean_t g_enclDiskChk(char *, char *); 177 178 /* hot.c */ 179 extern void g_ll_to_str(uchar_t *, char *); 180 extern void g_free_hotplug_dlist(struct hotplug_disk_list **); 181 182 /* map.c */ 183 extern int g_string_to_wwn(uchar_t *, uchar_t *); 184 extern int g_get_perf_statistics(char *, uchar_t *); 185 extern int g_get_port_multipath(char *, struct dlist **, int); 186 extern int g_device_in_map(gfc_map_t *, int); 187 extern int g_start(char *); 188 extern int g_stop(char *, int); 189 extern int g_reserve(char *); 190 extern int g_release(char *); 191 extern int g_issue_fcio_ioctl(int, fcio_t *, int); 192 extern void g_sort_wwn_list(struct wwn_list_struct **); 193 extern void g_free_wwn_list_found(struct wwn_list_found_struct **); 194 195 /* cmd.c */ 196 extern int cmd(int, struct uscsi_cmd *, int); 197 198 /* io.c */ 199 extern int g_scsi_persistent_reserve_in_cmd(int, uchar_t *, int, uchar_t); 200 extern int g_scsi_send_diag_cmd(int, uchar_t *, int); 201 extern int g_scsi_rec_diag_cmd(int, uchar_t *, int, uchar_t); 202 extern int g_scsi_writebuffer_cmd(int, int, uchar_t *, int, int, int); 203 extern int g_scsi_readbuffer_cmd(int, uchar_t *, int, int); 204 extern int g_scsi_inquiry_cmd(int, uchar_t *, int); 205 extern int g_scsi_log_sense_cmd(int, uchar_t *, int, uchar_t); 206 extern int g_scsi_mode_select_cmd(int, uchar_t *, int, uchar_t); 207 extern int g_scsi_mode_sense_cmd(int, uchar_t *, int, uchar_t, uchar_t); 208 extern int g_scsi_read_capacity_cmd(int, uchar_t *, int); 209 extern int g_scsi_read_capacity_1016_cmd(int, struct scsi_capacity_16 *, 210 int); 211 extern int g_scsi_release_cmd(int); 212 extern int g_scsi_reserve_cmd(int); 213 extern int g_scsi_start_cmd(int); 214 extern int g_scsi_stop_cmd(int, int); 215 extern int g_scsi_tur(int); 216 extern int g_scsi_reset(int); 217 extern int g_devid_get(char *, ddi_devid_t *, di_node_t root, 218 const char *); 219 220 /* mpath.c */ 221 extern int g_get_lun_str(char *, char *, int); 222 extern int g_get_lun_number(char *); 223 extern int g_get_pathcount(char *); 224 extern int g_devices_get_all(struct wwn_list_struct **); 225 226 #ifdef __cplusplus 227 } 228 #endif 229 230 #endif /* _G_STATE_H */ 231